Porque deveria me preocupar com Progressive Web App (PWA)?

Antes de começar em Progressive Web App, primeiro vamos comentar o estado atual da World Wide Web.
A partir de janeiro de 2017, 8,05 bilhões de dispositivos estão conectados em todo o mundo (mais do que a população mundial atual, que é de 7,5 bilhões). Das quais 55% (4,42 bilhões) de conexões são usadas em smartphones.

O Chrome do celular está sendo consumindo em mais de 1 bilhão de usuários mensais, isso significa um enorme crescimento de 150% em  relação ao ano de 2016.

De acordo com estimativas em 2020, 40 a 50 bilhões de dispositivos serão conectados em todo o mundo.
A maioria dos usuários virá de áreas rurais e outros países em desenvolvimento onde os dados são caros ou com alta latência ou ambos.

Comportamento dos usuários:

Comportamento Usuarios

Fonte : comScore Mobile Metrix, U.S

Porque usuários preferem usar Apps ao invés de website?
É porque aplicativos nativos são:

  • Confiável
  • Rápida inicialização
  • Funcionam offline
  • Notificações Push trazem informações do App
  • Icone na tela “Home” mantém a visibilidade do App

Pesquisa Web Mobile

Fonte : comScore Mobile Metrix, U.S

Mas o alcance da Web móvel é 3 vezes maior que a de um App

Vantagens da web móvel

  • Imediação (Os sites móveis estão instantaneamente disponíveis)
  • Capacidade de encontrar (busca) (Os sites móveis podem ser facilmente encontrados)
  • Alcance (A média de visitas por usuário é de 100 sites/mês)
  • Compatibilidade (Sites móveis são compatíveis com todos dispositivos)
  • Lincável” (Compartilhamento facilitado via URL, não requer instalação complexa)
  • SEO (Os conteúdos do site móvel podem ser indexados pelos motores de busca)
  • Baixa fricção (Para usar um site móvel você precisa apenas de um navegador diferente dos aplicativos que têm fricção inicial muito alta)

Mas porque os App estão sendo mais utilizados que Web móvel, mesmo que a Web móvel tem alcance maior?

De acordo com a pesquisa do Google, o tempo médio de carregamento de um site móvel é de 19 segundos.
Mas um usuário espera carregar o site em 3 segundos. Então você perderá cerca de 40% do usuário se o site demorar mais de 3 segundos para carregar.
E 100% do usuário se demorar mais de 10 segundos.

Além disso, é fácil tocar em um ícone de tela inicial em vez de digitar o URL.

O site móvel não possui uma opção de notificação/Push.

Solução

Progressive web Apps (PWA)

O que é PWA?

PWA é experiências de usuário que combinam o melhor da web e o melhor dos aplicativos.

Eles são:

  • Progressivo (Trabalhe para todos os usuários, independentemente da escolha do navegador porque eles são construídos com aprimoramento progressivo como um princípio básico)
  • Responsivo (Ajustar qualquer forma: desktop, celular, tablet ou formulários ainda não emergentes)
  • Independente de conexão (Service workers permitem o trabalho off-line ou em redes de baixa qualidade)
  • App-like (Experiência um App com interações e navegação de estilo de aplicativo)
  • Recente (Sempre atualizado graças ao processo de atualização do serviço)
  • Seguro (Servido através de HTTPS para evitar espionagem e garantir que o conteúdo não tenha sido adulterado)
  • Descoberto (São identificáveis como “aplicativos” graças aos manifestos do W3C e ao escopo de registro do trabalhador de serviço, permitindo que os motores de busca os encontrem)
  • Re-engajável (Facilite o reengajamento através de recursos como notificações push)
  • Instalável (Permitir que os usuários “mantenham” aplicativos que acham mais úteis em sua tela inicial sem o incômodo de uma loja de aplicativos)
  • Linkable (Facilmente compartilhado via URL e não requer instalação complexa)

Como visto um PWA cria uma espécie de integração entre o mundo Web de sites e os Apps. Para o ano de 2018 existem alguns pontos a serem consolidados para tornar a união destas duas experiências padrão. É uma nova tendência que permitirá, principalmente países com baixa infra estrutura de redes móveis, a viabilidade e facilidade de utilização de diversos tipos de aplicações, das quais hoje só é permitido com uma conexão ativa.

Anúncios

Problemas de Upload de arquivos com Primefaces?

Problemas de Upload de arquivos com Primefaces?

Verifique se adicionou em seu web.xml:

    <!-- Muito importante -->
	<context-param>
		<param-name>primefaces.UPLOADER</param-name>
		<param-value>commons</param-value>
	</context-param>	
	
	<filter>
	 <filter-name>PrimeFaces FileUpload Filter</filter-name>
	 <filter-class>
	  org.primefaces.webapp.filter.FileUploadFilter
	 </filter-class>
	</filter>
	<filter-mapping>
	 <filter-name>PrimeFaces FileUpload Filter</filter-name>
	 <servlet-name>Faces Servlet</servlet-name>
	</filter-mapping>
	
	<servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>/faces/*</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>*.xhtml</url-pattern>
    </servlet-mapping>
    <context-param>
        <description>State saving method: 'client' or 'server' (=default). See JSF Specification 2.5.2</description>
        <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
        <param-value>client</param-value>
    </context-param>
    <context-param>
        <param-name>primefaces.UPLOADER</param-name>
        <param-value>auto</param-value>
    </context-param>
    <listener>
        <listener-class>com.sun.faces.config.ConfigureListener</listener-class>
    </listener>	
  

A dependencias para upload de arquivos são:

		
		<dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.5</version>
            <scope>provided</scope>
        </dependency>
        <!-- Faces Implementation -->
        <dependency>
            <groupId>com.sun.faces</groupId>
            <artifactId>jsf-impl</artifactId>
            <version>2.2.4</version>
        </dependency>
        <!-- Faces Library -->
        <dependency>
            <groupId>com.sun.faces</groupId>
            <artifactId>jsf-api</artifactId>
            <version>2.2.4</version>
        </dependency>
        <!-- Primefaces Version 5 -->
        <dependency>
            <groupId>org.primefaces</groupId>
            <artifactId>primefaces</artifactId>
            <version>5.0</version>
        </dependency>
		<!-- File uploads -->
		<dependency>
			<groupId>commons-fileupload</groupId>
			<artifactId>commons-fileupload</artifactId>
			<version>1.2.1</version>
		</dependency>
		<dependency>
			<groupId>commons-io</groupId>
			<artifactId>commons-io</artifactId>
			<version>1.4</version>
		</dependency>  
		
        <!-- JSP Library -->
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>javax.servlet.jsp-api</artifactId>
            <version>2.3.1</version>
        </dependency>
        <!-- JSTL Library -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.1.2</version>
        </dependency>		
	

index.xhtml:

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:p="http://primefaces.org/ui">
    <h:head>
        <title>Journaldev Tutorial</title>
    </h:head>
    <h:body>
        <h:form enctype="multipart/form-data">
                <p:fileUpload value="#{fileUploadManagedBean.file}"  mode="simple"></p:fileUpload>
                <p:separator/>
                <h:commandButton value="Dummy Action" action="#{fileUploadManagedBean.dummyAction}"></h:commandButton>
        </h:form>
    </h:body>
</html>		

FileUploadManagedBean.java:

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
 
import org.primefaces.model.UploadedFile;
 
@ManagedBean
@SessionScoped
public class FileUploadManagedBean {
    UploadedFile file;
 
    public UploadedFile getFile() {
        return file;
    }
 
    public void setFile(UploadedFile file) {
        this.file = file;
    }
 
    public String dummyAction(){
        System.out.println("O nome do arquivo é "+file.getFileName()+" :: Uploaded File Size :: "+file.getSize());
        return "";
    }
}

Conclusão
Este artigo tem intenção de prover uma explicação da utilização do FileUpload do Primefaces. Caso não esteja conseguindo realizar upload, tente verificar se todos os passos estão realizados e não falta nenhum detalhe. O componente FileUpload tem muitas funcionalidades e permite que o programador mantenha o foco do trabalho nas regras de negócio ao invés de ficar reinventando a roda.

Java 8 e StringJoiner

Na ultima versão do Java 8 foi adicionado o StringJoiner no pacote java.util.
É uma implementação juntar as pedaços em comparação, um facilitador da antiga abordagem usando StringBuffer / StringBuilder.
Vamos ver o uso do StringJoiner e como funciona a implementação.

Por exemplo, tenho duas cadeias como “Andre” e “Rezende” e eu quero juntar essas cadeias como [Andre, Rezende]. Neste caso, eu tenho o prefixo como “[“, o sufixo como “]” e o delimitador como “,”. StringJoiner tem dois construtores como dado abaixo.
StringJoiner (CharSequence delimitador)
StringJoiner (CharSequence delimitador, CharSequence prefixo, sufixo CharSequence)
Queremos ter prefixo e sufixo, portanto, vamos usar o segundo construtor para o nosso exemplo.

StringJoiner sjr = new StringJoiner(",", "[", "]");
sjr.add("Andre").add("Rezende");
System.out.println("A string final é " + sjr);

Resultado será a saída no console: A string final é [Andre,Rezende]

Se não quiser adicionar o prefixo e sufixo, então:

StringJoiner sjr1 = new StringJoiner(",");
sjr1.add("Andre").add("Rezende");
System.out.println("A string final é " + sjr1);

Resultado será a saída no console: A string final é [Andre,Rezende]

Conclusão, não é uma baita implementação, ainda pode-se utilizar a StringBuilder ou StringBuffer, mas ele facilita um pouco a vida do desenvolvedor.

Qual a diferença entre JDBC e JDBI?

Recentemente um colega meu me indicou o usou de JDBI para substituir um ORM. ORM é bom para quem trabalha com múltiplos banco de dados e necessita colocar a mesma aplicação para consumir diferentes bancos de dados. Essa facilidade tem um custo, o custo de performance, pois as ferramentas de ORM precisam converter as chamadas SQL do framework para chamadas que o banco compreende, ou semelhante a nativa.

Então, porque ao invés de não se realizar direto a chamada de JDBC e não tivesse um framework que agilize meu desenvolvimento, mas não comprometa a performance?

Pensando nisso, a galera criou o JDBI, não é nova, tem desde 2004, mas eu só vim descobrir recentemente.

jDBI é uma biblioteca construída em cima de JDBC. JDBC funciona muito bem, mas geralmente parece otimizar para os fornecedores de banco de dados (escritores drivers). jDBI tenta expor a mesma funcionalidade, mas em uma API otimizada para os desenvolvedores.

É nível muito mais baixo do que um ORM como Hibernate ou JPA. A biblioteca é semelhante ao MyBatis (sucessora bifurcada para iBATIS).

jDBI suporta duas APIs estilo, um estilo velho, que se parece com:

List<AlgumaClasse> r = h.createQuery("select * from algo where id = :id and nome = :nome")
.bind("nome", "andre")
.bind("id", 1)
.map(AlgumaClasse.class)
.list();

E o estilo novo da API SQL objeto, que trabalha de uma forma reflexiva  e realmente abstraindo o JDBC:

interface NovoAPISQL
{
@SqlUpdate("insert into algo (id, nome) values (:id, :nome)")
int insert(@Bind("id") int id, @Bind("nome") String nome);

@SqlQuery("select id, nome from algo where id = :id")
AlgumaClasse findById(@Bind("id") long id);
}

A biblioteca tem uma boa referência (javadoc) e documentação estilo tutorial em http://jdbi.org/.

Concluindo

Outro lado interessante é que a comunidade trabalha bastante em melhorias e correções nela, por ser open source.
Vale a pena pensar se seu time ou seu projeto não merece ganhar uma produtividade no trabalho com tarefas de DAO.

Meu github: https://github.com/andremrezende

Resolvendo o problema de scroll com href do HTML com Jscript

Se deseja evitar o scroll do href bastar adicionar ao evento “onclick” um “return false”.
Exemplo:
Se tem um código parecido como abaixo em seu HTML, isso ocasionará um scroll de página, retornando ao topo da página.

<a href='#' onclick="javascript:alert('oi');">Fechar</a>

Para evitar o scroll, adicione um “return false” ao final de sua chamada jscript ou retorne false de sua função.

<a href='#' onclick="javascript:alert('oi');return false;">;Fechar</a>

Código HTML completo:

<html>
<head>
</head>
<body>
43243324423<br>
dfgdgfd<br>
fdgfdg<br>
fdgg<br>
dgdfg<br>
fdgdgfd<br>
gddgdgfd<br>
gfdfdgfd<br>
fdgfghgfhfhjfg<br>
gfhgffhgfhgf<br>
gfhgfghgh<br>
hhhfghgfh<br>
ffff<br>
43243324423<br>
dfgdgfd<br>
fdgfdg<br>
fdgg<br>
gddgdgfd<br>
gfdfdgfd<br>
fdgfghgfhfhjfg<br>
gfhgffhgfhgf<br>
gfhgfghgh<br>
hhhfghgfh<br>
ffff43243324423<br>
dfgdgfd<br>
fdgfdg<br>
fdgg<br>
dgdfg<br>
fdgdgfd<br>
gddgdgfd<br>
gfdfdgfd<br>
fdgfghgfhfhjfg<br>
43243324423<br>
dfgdgfd<br>
gfdfdgfd<br>
fdgfghgfhfhjfg<br>
gfhgffhgfhgf<br>
gfhgfghgh<br>
hhhfghgfh<br>
ffff43243324423<br>
dfgdgfd<br>
fdgfdg<br>
fdgg<br>
dgdfg<br>
fdgdgfd<br>
gddgdgfd<br>
gfdfdgfd<br>
<a href='#' onclick="javascript:alert('oi'); return false">Fechar</a>
</body>
</html>

Ajudando a Oracle a melhorar suas certificações Java

Já realizei 3 certificações da ex Sun e não prossegui com outras certificações depois da aquisição pela Oracle. O motivo é simples, estou descontentado com obrigação de se realizar curso em algumas delas.  Todas as minhas certificações adquiri material e realizei os exames com louvor. Sei que um curso é uma maneira mais prática e rápida de se adquirir um conhecimento, mas não acho que o caminho da Oracle fosse tornar isso obrigatório.

Hoje descobri que a Oracle está querendo mudar esse universo. Ela está realizando um questionário para tornar mais atraente o programa de certificação Java.

Quem puder contribuir, acredito que ajudaria muito a melhorar nossa comunidade Java brasileira.

O link é https://www.surveymonkey.com/s/YDMC2Q5

Abraços,
André Rezende

A internet das coisas

Image

Muito tem se falado sobre a internet das coisas, porém um grande problema é integração de equipamentos de diversos fabricantes.

Uma tecnologia que tem como proposta resolver parte desse problema é o BLE (Bluetooth Low Energy), o qual também visa economizar energia do dispositivos que utilizam de Bluetooth.

Para quem conhece a Apple, essa ela pode ser encontrada sobre o nome de iBeacon.

O grande desafio agora é permitir que o os usuários/clientes aceitem a instalação de softwares e/ou firmwares para realizar essa integração.

Compre Gadgets da China

Links relacionados:

http://targethd.net/ces-2014-samsung-smart-home-e-a-aposta-por-um-lar-inteligente/

http://convergenciadigital.uol.com.br/cgi/cgilua.exe/sys/start.htm?infoid=35710&sid=15#.UsxqkctTtAg