Vejas 4 razões para começar usar HTML5. Boa semana a todos!
“Porque Deus não nos chamou para a impureza, mas para a
santidade. 1 Tessalonicenses 4:7.
Vejas 4 razões para começar usar HTML5. Boa semana a todos!
“Porque Deus não nos chamou para a impureza, mas para a
santidade. 1 Tessalonicenses 4:7.
O InfoQ.com ouviu Anil Gaur, vice-presidente de desenvolvimento da Oracle, sobre o suporte a cloud computing no Java EE 7, incluindo o cronograma geral do projeto, e novas APIs e ferramentas. A especificação do Java EE 7 (JSR 324) inclui suporte à computação em nuvem para apoiar o desenvolvedores de aplicações que sejam portáveis entre diferentes plataformas PaaS (plataforma como serviço) baseadas no Java EE. Serão fornecidas APIs para desenvolver aplicações baseadas em PaaS e dar suporte a múltiplos clientes (multi-tenancy). Outras características previstas são ajustes de capacidade sob demanda e o provisionamento automático de serviços. Vejam a entrevista completa.
“É necessário que ele cresça e que eu diminua.” João 3:30
JEE é a tecnologia escolhida para aplicações corporativas “high-end”. JEE tornou-se a plataforma referencia para o desenvolvimento de aplicações web de alto tráfego. Soluções JEE são dotadas de uma arquitetura que se adapta muito bem. Você pode lidar com mais e mais usuários simultâneos adicionando mais containers Web com balanceamento de carga. Conforme você tem uma quantidade crescente de carga e transação, basta ir adicionando mais e mais servidores. Dessa forma, você pode lidar com mais e mais transações usuários simultâneos.
No entanto, todas as coisas boas chegam ao fim, e neste caso o acesso aos informações da solução não são capazes de manter-se com o volume cada vez maior de transações. Portanto, armazenamento de dados e acesso a dados se tornam na verdade um gargalo nestas soluções.
Como você remove esses gargalos de escalabilidade? O objetivo é não só melhorar o desempenho, mas sim para melhorar a escalabilidade. Escalabilidade aqui é definida como a capacidade de manter o bom desempenho mesmo sobe carga de pico de transações. Com efeito, se você tiver cinco usuários, a solução será muito rápida. Se você tem 500.000 usuários, ela provavelmente vai não só diminuir, mas na verdade engasgar. Se você tem boa escalabilidade, o desempenho do usuário 500.000 seria muito semelhante a um desempenho de cincos usuários.
Veja o artigo completo falando sobre o uso de cache distribuído em aplicações web JEE.
“Ó Soberano, como prometeste, agora podes despedir em paz o teu servo. Pois os meus olhos já viram a tua salvação…” Lucas 2:29-30
JLicense ™ é uma biblioteca Java utilitário para a criação e validação de chaves de licença. Ele inclui uma ferramenta simples com interface gráfica para gerenciar os arquivos de licenças e um LicenseManager (que deve ser incorporado dentro do seu software Java) para validar a licença. Você também pode escrever sua própria classe, como um Servlet, para criar o arquivo de licença dinamicamente baseado na entradas de dados de um usuário final. É possível validar a licença com base nos recursos, como por exemplo, adicionar recursos como endereço IP, endereço MAC, o usuário número etc
A versão atual do JLicense é de 2,7. Você pode baixar binário toolkit JLicense e usá-lo gratuitamente. API JLicense também está disponível online.
Código fonte JLicense é para desenvolvedores Java que não querem gastar muitos dias escrevendo suas ferramenta própria de gerenciamento de licenças para suas soluções. O código fonte está disponível por US $ 50 e o pagamento pode se feito através do PayPal online.
E onde estão os deuses que você fabricou para si? Que eles venham, se puderem salvá-la na hora da adversidade! Porque os seus deuses são tão numerosos como as suas cidades, ó Judá! Jeremias 2:28
As modernas aplicações web de hoje precisam estar devidamente preparadas para atender o publico em sua totalidade. Isso que dizer que a solução web precisa estar acessível para ser usada em navegadores de desktops e principalmente agora nos navegadores dos modernos dispositivos móveis conhecidos como smartphones e tablets que se infiltram cada dia mais no cenário das corporações.
O fator de complicação dessa nova tendência é que a filosofia de usabilidade de aplicações web nos navegadores móveis é completamente diferente da usabilidade de um navegador desktop. Mesmo os dispositivos móveis hoje tendo uma alta capacidade computacional, eles se diferem em dois aspectos chaves:
Isso quer dizer uma mesma solução desenvolvida para ser utilizada no navegador do desktop pode ter seu uso totalmente impraticável em dispositivos móveis. É justamente o que tem acontecido na maioria das vezes. Temos dispositivos com alta capacidade computacional e conexão 3G, mas quando você entra em uma solução web, logo de inicio percebe que fica impraticável ficar gerenciando zoom nos monitores reduzidos e usando touch para disparar as ações. Quem ainda não passou por isso?
Interface gráfica web para navegadores de dispositivos móveis não podem ser grandes, nem complexos e os componentes de ações devem ser maiores com espaçamento significativo entre eles. Tudo isso tem o com objetivo de gerar facilidade no momento de disparar as ações via touch. Outro fator é que estas interfaces devem ser resumidas, oferecendo objetividade no acesso e a leitura para as informações dentro do contexto da solução. Veja neste artigo os pontos problemáticos de usabilidade.
E é péssimo abrir algum Site que não esteja otimizado para mobile. Mesmo nos smartphones mais modernos com telas maiores que permitem abrir sites normais, não há dúvidas que um site não otimizado para mobile traz uma pior experiência para o usuário. E isso prejudica suas vendas, trata mal potenciais clientes e até afeta negativamente sua marca.
O responsável por uma solução web hoje deve implicitamente considerar tal requisito e assim preparar sua solução para atender essa demanda de navegadores móveis. É justamente isso que eu hoje gostaria falar hoje. No geral, temos duas abordagens parar resolver tal questão:
Criar uma única camada de apresentação na solução para ambos os navegadores, fazendo as interfaces gráficas se comportarem especificamente quando forem acessadas por navegadores de dispositivos móveis. Quando um dispositivo móvel acessar as páginas da solução, será necessário tem certa “inteligência” que aplique algumas mudanças nas páginas como redução de layout, não envio de algumas imagens mais pesadas, maior separação entre os botões de ação e até troca de alguns componentes por outros mais intuitivos.
Pontos Positivos
Pontos Negativos
Não existe segredo! A camada de visão necessitara ser “costurada” com decisões que gerem a mudanças adequadas que melhor customizem as páginas quando um navegador de dispositivo móvel estiver acessando.
Nesta abordagem é criada uma camada de apresentação na solução exclusiva para cada um deles, uma para desktop e outra para os navegadores móveis. Quando o usuário acessar a pagina de entrada, a solução identificara o navegador corrente e redirecionara para a determinada camada A ou B. Essa é a abordagem mais usada hoje pelos grandes players do mercado.
Pontos Positivos
Pontos Negativos
Construa uma versão diferente de cada interface gráfica de todos os processos oferecidos pela solução:
O objetivo é dar manutenção em duas interfaces gráficas diferentes, mas a regra de negócio de ambas é a mesma e dever ser totalmente reutilizável. Para alcançar isso, adicione uma camada lógica de serviço usando padrão Facade[GOF] entre as camadas de visões e a camada de negócio da solução, não permitindo dependência direta entre elas. Com esta camada de serviço, é possível centralizar os comportamentos em comuns das ambas camadas de apresentação, na interação com a camada de negócio. Isso que dizer que qualquer manutenção das regras e ou processo de negócios serão propagadas para ambas a camada de visão.
Mesmo tendo duas camadas de apresentação, as regras de autenticação e autorização também continuam a mesma. O mecanismo de autenticação e autorização da solução deve ser projetado de forma flexível para que possa reconhecer que ambas camadas de visão estão debaixo das mesma “regras de credencialidade”.
Temos hoje duas vertentes diferentes de paradigmas para a filosofia de construção das paginas web para dispositivos móveis.
As paginas são construídas para os dispositivos móveis iguais a uma pagina HMLT padrão. O único diferencial é que elas são otimizadas, simples, com menos código, layouts, poucas ou sem imagens, css simples e com javascripts básicos.
As paginas são construídas aparentando serem interfaces gráficas desktop da própria plataforma móvel. Ou seja, as páginas aparentam ser aplicações nativas, utilizando todos os componentes específicos e a forma de usabilidade totalmente voltada para as monitores otimizados. Provedores de componentes JSF 2.0 já identificaram essa nova abordagem de solução é já estão fornecendo componentes 100% automáticos. Veja alguns exemplos:
RichFaces Mobile
PrimeFaces Mobile
Da mesma forma ja existem vários frameworks javascript oferecendo também componentes prontos para criar aplicações web mobile. Segue os destaques:
Sencha Touch
Na verdade todas elas são simples páginas HTML puras com algumas imagens, css e javascript que “simulam” as funcionalidades equivalentes a aplicações nativas instaladas no próprio aparelho móvel. Dessa forma é possível entregar uma solução web com aparência e a usabilidade de uma aplicação nativa.
“Feliz é o homem que persevera na provação, porque depois de aprovado receberá a coroa da vida, que Deus prometeu aos que o amam.” Tiago 1:12
Como foi previsto por mim e muitos outros, a nova especificação do JEE 6 realmente conseguiu reduzir a carga pesada que vinha colocando no modelo EJB. Fato é que nós realmente tentávamos a todo custo evitar usar um container JEE FULL optando por um container web, adicionado manualmente os serviços extras como gerenciamento de transação, timers, JPA etc. Nesse cenário, o framework Spring disparou no mercado Java, sendo um dos ‘lightware container” mais usados para controlar esses serviços. Com o objetivo de fechar a idéia do assunto, a dica de hoje é apresentar alguns artigos que apresentam vantagens e como migrar uma aplicação desse modelo Spring para o novo modelo Web Profile:
Bom final de semana para todos!
“Pois desde a criação do mundo os atributos invisíveis de Deus, seu eterno poder e sua natureza divina, têm sido vistos claramente, sendo compreendidos por meio das coisas criadas, de forma que tais homens são indesculpáveis…” Romanos 1:20
Um dos ataques mais comuns a sistemas web na atualidade é o sequestro de sessão ou mais conhecido como “Session Hijacking”. Hoje eu gostaria de falar um pouco sobre o assunto, apresentando uma aplicação prática de como roubar uma sessão, invadir um site e acessar a conta da vítima.
A facilidade de se roubar uma sessão se da pelo justo fato do HTTP ser um protocolo de comunicação sem estado e por isso necessitar que um número de identificação trafegue dentro de todas as interações que um navegador de internet fizer para se comunicar com a solução web.
Todas as vezes que você acessa uma aplicação web, o sistema te envia um numero único que será usado para identificar que você é você durante o uso da aplicação ao longo do tempo. Ou seja, todas as vezes que você entrar no site após abrir o navegador de internet, o sistema vai te enviar um número como por exemplo: 123ABC que será seu identificador único. O navegador de internet foi programado para armazenar esse número e envia-lo de volta todas as vezes que você interagir com o sistema, clicando (link, botão, aba, menu etc) na página, fazendo a solução web processar seu pedido e saber que você é você. A questão é que esse identificador fica disponível e visível para ser roubado por qualquer pessoa que tenha conhecimentos mínimos de manipulação de rede e ou protocolo HTTP.
O identificador pode ser facilmente roubado de varias maneiras. Segue alguma delas:
1. Trafego HTTP – qualquer pessoa que tenha conhecimentos básicos de rede pode facilmente usar uma ferramenta chamada de “Sniffer” para interceptar todos os pedidos de internet trafegados em uma rede, visualizando todo o conteúdo do protocolo e assim localizar esse identificador.
2. No Navegador – o identificar pode ser acessado via javascript usando o comando “documento.cookie”. Isso abre varias possibilidades:
3. Link Malisioso - O usuário pode ser induzido a entrar em um link originário de algum e-mail falso ou de outro site dizendo “depois de logar no seu internet bank, click aqui para atualizar seu cadastro”. O link ou o site falso pode ser programado para ter comandos javascript que extraia esse identificador.
4. Adivinhação – Algumas soluções web tem a geração do número identificar seguindo uma lógica no qual pode ser facilmente adivinhado. Por exemplo, se o último identificador gerado foi ABC123 o próximo poderia ABC1234.
De qualquer forma que o identificador seje sequestrado, o atacante de posse desse número pode então acessar e usar a solução web fazendo o sistema pensar que o atacante é o próprio usuário autenticado.
Você entra no seu site de comercio eletrônico preferido, colocando seu login e senha. A partir disso começa a navegar nos livros, procurando algum do seu interesse. Nesse tempo seu identificador de sessão é roubado por uma pessoa que esta visualizando todo o trafego HTTP da rede e o atacante assim faz comunicação com essa aplicação web de comercio eletrônico fazendo a solução pensar que ele é você usando o sistema. Diante disse, o atacante pode então executar qualquer ação maliciosa que prejudique você e a solução como por exemplo, visualizar e ou alterar suas informações pessoais como endereço, cartão de credito, trocar seu cadastro, gastar seus cupons de vale-desconto ou colocar um endereço de entrega falso, ficando com sua última compra. Tudo depende do cenário da aplicação.
Vamos para a brincadeira. Hoje vamos invadir o site do Java Ranch muito conhecido pela comunidade Java mundial. O endereço do site é http://www.coderanch.com/forums/user/login e da acesso para a pagina de autenticação:
Vou colocar meu usuário e senha, me autenticando na aplicação.
Veja que eu entro no link “My Profile” e vejo minhas informações pessoais:
Para simular o sequestro de sessão, vou executar um simples javascript no navegador que acessa o número. Eu digito na barra de endereço “javascript:alert(document.cookie)” e obtenho o número da minha sessão estabelecido após me autenticar:
Veja que esse roubo pode ser feito no tráfego, por vírus, spam de e-mail ou qualquer outra coisa que maliciosamente pegue esse número. Repare que o identificar de sessão neste site esta declarado como JSESSIONID=4AD7D9322052B800F6BF03D2811AA895;
Com esse número em mãos, o atacante pode usar qualquer ferramenta HTTP para trocar requisições no site do fórum anexando o ID da sessão roubado. Com isso, o site do javaranch vai responder achando que na verdade é o próprio usuário apenas fazendo mais uma requisição. Para mostrar isso, eu escrevi uma simples aplicação Java que envia um pedido HTTP para o qualquer endereço na internet, no qual eu possa mecanicamente adicionar um número da sessão e com isso simular o cenário. Segue a abaixo o fonte do sistema:
Esse sistema apenas envia uma requisição HTTP para um endereço configurado, anexando qualquer ID de sessão e como resultado imprime no console a página de resposta retornada pela aplicação. Ao executá-lo passando o valor da sessão roubada, o site do javaranch me envia a página de resposta do meu usuário, mostrando todos as minhas informações. Ou seja, o atacante agora pode então acessar o fórum fazendo a aplicação pensar que as requisições originarias da ferramenta de ataque são do próprio usuário logado. A partir dai é muito fácil manipular a ferramenta para gerar requisições que manipulem todos os processos disponibilizados pelo sistema. Caso alguem se interesse nessa ferramenta é só postar um comentário no artigo requisitando que eu prazer em compartilhar.
Os responsáveis pelas soluções web devem estar cientes das possíveis vulnerabilidades existentes nas “entrelinhas” tecnológicas da atualidade, juntamente com as questões e situações que envolvem os “ciclos de desenvolvimento” e assim devem implementar contra-medidas que venham inibir cada vulnerabilidade que possam gerar problemas dentro do contexto da negocio da solução.
O sequestro de sessão é apenas um caso de brecha das muitas dezenas existentes hoje no qual eu percebo que maioria dos responsáveis estão na verdade mal preparados e completamente a margem da situação. Para os interessados no assunto segue as minhas dicas de leituras.
Eu me coloco a disposição para qualquer eventual dúvida sobre o assunto. Até a próxima pessoal
!
“Aquele que supre a semente ao que semeia e o pão ao que come, também lhes suprirá e multiplicará a semente e fará crescer os frutos da sua justiça.” 2 Coríntios 9:10
Uma solução segura é aquela que identifica todas as suas possíveis vulnerabilidades, implementando mecanismos que tenham o objetivo de reduzir qualquer tipo de danos caso ela seja vítima de um ataque. As vulnerabilidades estão espalhadas em todas as camadas da solução – Física, Rede, Servidores e Aplicação.
Qualquer fraqueza em qualquer ponto da solução pode ser explorada por um atacante. Dentro desse assunto, hoje eu gostaria de publicar meu plano de Gerenciamento de Vulnerabilidades para aplicações web em nível de aplicação. Ou seja, é o levantamento resumido da maioria das possíveis vulnerabilidades que os arquitetos, projetistas e programadores devem estar cientes no momento de construir suas aplicações. As camadas física, rede e servidores são de responsabilidade de infra, ficando assim fora do escopo deste artigo.
Cada vulnerabilidades de aplicação esta classificada de acordo sua aplicabilidade, no qual eu apresento uma breve descrição e as possíveis soluções adotadas. Para um melhor entendimento eu retirei qualquer detalhe de tecnologia/framework, fazendo com que o leitor possa facilmente entender e assim tomar medidas cabíveis dentro do seu próprio projeto. O objetivo desse plano é ser usado como um “pente fino” para que os responsáveis de soluções possam sistematicamente refinar sua solução antes de coloca-la em produção. Vale lembrar que é muito mais barato, fácil e robusto as práticas serem adotadas dentro do planejamento arquitetural, antes da solução ser desenvolvida.
Para aqueles que desejam um dia ter as minimas condições de entregar um solução web segura, segue indicações de leitura obrigatória:
“Eu sou o Alfa e o Ômega, diz o Senhor Deus, o que é, o que era e o que há de vir, o Todo-poderoso. Alguém Semelhante a um Filho de Homem.” Apocalipse 1:8
Arun Grupta acabou de publicar os possíveis novos serviços que serão incluidos no JEE 7. Segue abaixo:
Java EE 7 (JSR 342)
JPA 2.1 (JSR 338)
JAX-RS 2.0 (JSR 339)
Servlets 3.1 (JSR 340)
Expression Language 3.0 (JSR 341)
Java Message Server 2.0 (JSR 343)
Java Server Faces 2.2 (JSR 344)
EJB 3.2 (JSR 345)
CDI 1.1 (JSR 346, more details)
Bean Validation 1.1 (JSR 349)
JCache (JSR 107)
State Management (JSR 350)
Batch Application for the Java Platform (JSR 352)
Concurrency Utilities for Java EE (JSR 236)
Java API for JSON Processing (JSR 353)
Para o Java e o além!!
“Por essa razão era necessário que ele se tornasse semelhante a seus irmãos em todos os aspectos, para se tornar sumo sacerdote misericordioso e fiel com relação a Deus, e fazer propiciação pelos pecados do povo.” Hebreus 2:17
Hoje eu gostaria de divertidamente abordar o famoso erro de falta de memória frequente das soluções Java. Os dois sabores mais comuns deste delicioso erro são: java.lang.OutOfMemoryError: Java heap space e java.lang.OutOfMemoryError: PermGen. Com isso, vamos nos divertir no assunto:
Gerenciamento de memória em soluções Java é como uma brincadeira de criança. Todo aplicativo Java é executado um cima da JVM que por sua vez esta instalada em cima do S.O. Todo sistema operacional disponibiliza um espaço determinado fixo de memória RAM total da estação para a uso da JVM. Em outras palavras seria afirmar que um programa Java tem disponível para gastar memoria um copo vazio, de tamanho previamente determinado no qual poderíamos exemplificar como um de 300 ml.
Cada vez que o programa Java executando aloca uma variável ou objeto, seria como se ele estivesse gastando espaço nesse copo, adicionado uma gota de água la dentro. Vale lembrar que existem muitas outras coisas dentro de um programa Java que também gasta memória. Nesse sentido, o programa vai sendo usado e o nosso copinho de água vai se enchendo.
Agora vamos para o detalhe mais importante, quando a água ultrapassa a media de 70% do total disponível da memória, a JVM tem um camarada que se chama “Coletor de Lixo” que é avisado para limpar essa memória. Esse coletor de lixo então se prepara e a qualquer momento a partir disso, ele acaba passando para fazer seu trabalho. Voltando para nossa brincadeira, o coletor de lixo é o cara que tem a responsabilidade de esvaziar a água do copo.
Continuando nossa linha de raciocínio, o coletor de lixo no momento sublime e único da solução é executado e assim consegue esvaziar um tanto de memória, reiniciando então o ciclo de gastos. Na visão da nossa brincadeira, o coletor de lixo derramaria então um tanto de água, esvaziando parcialmente o nosso copinho. Esse é ciclo que eu chamo de “marawonderfull”! A aplicação vai sendo executada, gastando memória (adicionado gotinhas de água no copo de 300 ml) e o coletor de lixo vai de tempos em tempos esvaziando uma parte da água. Seria o cenário ideal de uma solução Java.
Como tudo da vida não é perfeito, vamos ao terror! Imagine na sua cabeça agora o que aconteceria se o coletor, dentro dos ciclos de sua passagem não conseguisse esvaziar nada de água? A aplicação vai gastando, gastando, adicionando água e quando você menos espera bummmmm, acontece o “java.lang.OutOfMemoryError” que significa nada mais simples que:
“não é possível continuar executando esse programa Java porque ele ta precisando gastar memória e o copo já esta totalmente preenchido.”
A partir desse ponto de visão é muito mais fácil entender quais são os motivos da falta de memória:
O que eu mais vejo nas consultorias e fóruns são os desenvolvedores despreparados, que mesmo bem tensionados acabam escrevendo código que resulte em gastos de memória totalmente desenfreados, sem nenhum critério, preocupação ou um padrão arquitetural previamente estabelecido.
1.1 Alterar o código da aplicação, aplicando sistematicamente melhores práticas diante de cada situação ou elaborar e estabelecer uma arquitetura padrão que contemple práticas de otimização. Que tipos de praticas? Segue algumas:
1.2 Elaborar e estabelecer uma arquitetura padrão para a solução que previamente contemple todas as práticas de otimização envolvidas dentro do contexto. Aqui já é necessária a contratação de consultor ou alguma empresa que faça o papel de um arquiteto.
Caso a solução já esta 100% otimizada, entenda que a única coisa que pode ser feito é aumento da memória. Ou seja, se a solução esta gastando o mínimo possível e ainda assim esta precisando de mais memória, a unica resposta lógica e cabível é que o copo de 300 ml não é suficiente para executar essa determinada solução. Isso não é o fim do mundo, muito pelo contrario, é algo totalmente corriqueira e normal. Situação muito comum em aplicativos Java para Web no qual o número de usuários simultâneos é gradativamente crescente no tempo de vida de existência da solução.
A situação complicada de se aumentar o espaço de memória para a JVM é devido a complexidade do seu funcionamento, no qual o desenvolver precisa ter o conhecimento básico de seu funcionamento, regiões e responsabilidades para assim ter autonomia de parametrização. Para aqueles interessados segue alguns artigos que cobrem esses tópicos:
Em aplicações de pequeno/médio porte, a configuração de 2 parâmetros já são suficiente para estabilizar uma solução em produção:
Em soluções de larga escala, muitos parâmetros podem ser alterados, inclusive selecionar e customizar diferentes tipos de coletores de lixo.
“Nós, que somos fortes, devemos suportar as fraquezas dos fracos, e não agradar a nós mesmos.” Romanos 15:1