domingo, 17 de abril de 2016

Json com Jackson

Atualmente são inúmeras a quantidade de bibliotecas para se trabalhar com Json, isso se deve a notação leve de troca de dados, a facilidade de interpretação, tanto humana quanto a nível de máquina.
Nesse post eu vou estar explicando como trabalhar com esse carinha aqui, Jackson.

Json com Jackson



Bom, mas antes de falarmos sobre a biblioteca vamos entender um pouco sobre o que é Json. O site oficial descreve Json sendo:

"JSON (JavaScript Object Notation - Notação de Objetos JavaScript) é uma formatação leve de troca de dados.
Para seres humanos, é fácil de ler e escrever. Para máquinas, é fácil de interpretar e gerar.

Está baseado em um subconjunto da linguagem de programação JavaScript.
JSON é em formato texto e completamente independente de linguagem, pois usa convenções que são familiares às linguagens C e familiares, incluindo C++, C#, Java, JavaScript, Perl, Python e muitas outras.

Estas propriedades fazem com que JSON seja um formato ideal de troca de dados.
JSON está constituído em duas estruturas:
  • Uma coleção de pares nome/valor. Em várias linguagens, isto é caracterizado como um object, record, struct, dicionário, hash table, keyed list, ou arrays associativas.
  • Uma lista ordenada de valores. Na maioria das linguagens, isto é caracterizado como uma array, vetor, lista ou sequência.
Estas são estruturas de dados universais. Virtualmente todas as linguagens de programação modernas as suportam, de uma forma ou de outra. É aceitavel que um formato de troca de dados que seja independente de linguagem de programação se baseie nestas estruturas." Para mais informações acesse o site Json-BR.

Já sabemos o motivo da quantidade de bibliotecas existentes, o motivo de tanta informação relacionado a "formatação" JSON que tende a ser usado cada vez mais em várias aplicações.

Agora, sobre a nossa biblioteca, vamos aprender como converter Java para Json e Json para Java.

Vamos considerar o pojo abaixo:

public class Pessoa {

    private String nome;
    private int idade;
    private String profissao;
    private BigDecimal salario;
    private List habilidade;

    //getters and setters
}

Seria necessário configurar e criar a estrutura em um banco de dados, mas para nível de entendimento vamos criar um arquivo texto, dando o nome para o arquivo de "Pessoa.json" e salvar em algum lugar da sua máquina, aqui estarei salvando em "D://Pessoa.json".
Nesse arquivo teremos o seguinte registro:

{"nome":"Fagner Zordan","idade":26,"profissao":"Analista de Sistemas","salario":10000,"habilidade":["java","php","unity3d"]}

Lembre-se Json trabalha com "chave":"valor", um exemplo seria: "nome":"Fagner Zordan".
Note que os atributos da nossa classe "Pessoa" possui os mesmas chaves no nosso arquivo Json.

Já temos nosso pojo criado com os get e set implementados, temos nosso registro no formato Json salvo na nossa máquina, vamos agora converter o objeto Java em JSON:

ObjectMapper mapper = new ObjectMapper();
Pessoa obj = new Pessoa();

//Objeto para JSON salvo no arquivo
mapper.writeValue(new File("D:\\Pessoa.json"), obj);

//Objeto para JSON armazenado em String

String jsonEmString = mapper.writeValueAsString(obj);


E no trecho a seguir convertemos JSON para objeto Java:

ObjectMapper mapper = new ObjectMapper();
String jsonEmString = "{'nome' : 'Fagner Zordan'}";

//JSON do arquivo para Objeto
Pessoa obj = mapper.readValue(new File("D:\\Pessoa.json"), Pessoa.class);

//JSON de uma URL para Objeto
Pessoa obj = mapper.readValue(new URL("http://www.deviscoming.blogspot.com.br/Pessoa.json"), Pessoa.class);

//JSON de uma String para Objeto
Pessoa obj = mapper.readValue(jsonEmString, Pessoa.class);

Viu como é fácil?
Logo estarei disponibilizando um "projeto" (aplicação funcionando usando JSON) no github, e volto a postar aqui.

Por enquanto é isso, abraço e até a próxima.

Primeiros passos com Spring MVC

A empresa Algaworks, localizada em Uberlândia, Minas Gerais, que trabalha desde 2004 com cursos de desenvolvimento de software, está disponibilizando um livreto digital gratuito que ensina primeiros passos sobre Spring MVC.

Primeiros passos com Spring MVC


O que você vai aprender nesse livreto:

1. Introdução

2. O Spring
2.1. Introdução
2.2. Spring vs Java EE
2.3. O Spring Boot
2.4. O Spring MVC
2.5. O Thymeleaf
2.6. O Maven
2.7. O Spring Tool Suite - STS

3. O projeto de gestão de convidados
3.1. Funcionamento
3.2. Criando o projeto no STS
3.3. Criando o controller
3.4. Criando a página
3.5. Rodando o projeto pela primeira vez
3.6. Repositório de convidados
3.7. Enviando um objeto do Controller à View
3.8. Listando objetos com o Thymeleaf
3.9. Adicionando um convidado

4. Conclusão
4.1. Próximos passos

Gostou? Então acesse o site, preencha seu e-mail e abrace essa oportunidade.

Bons estudos e até a próxima!

sexta-feira, 15 de abril de 2016

Kite - Seu copiloto de programação


GO GO! - Congresso de Mobile (Palestras)

Olá!

Anteriormente eu havia postado sobre o evento de "Congresso de Mobile", deixo o link pra quem não acompanhou e gostaria de saber mais sobre.

GO GO! Congresso de Mobile - Videos


Sinto informar mas o evento já acabou, no entanto os organizadores disponibilizaram as 2 palestras mais votadas, e estou deixando o link aqui pra que vocês possam assistir.
Vale lembrar que os videos estarão disponíveis apenas até o dia 18/04/2016.


Nessa palestra Weliton Carlos Flor, fala sobre "Como Criar Aplicativos de Qualidade Para iOS e Android Com Html e JavaScript" usando IONIC, e explica também sobre a diferença entre aplicativos nativos e hibrido.

E nessa outra palestra Robert Souza, fala sobre "Segurança da Informação: Vulnerabilidade em Dispositivos móveis", explica como funciona alguns trojans e vírus,  e explica formas de evita-los.

Pessoal é isso, aproveitem os videos, não foi a toa que esses videos foram selecionados, são palestras muito boas.
Até a próxima.

Debug #4 - Git revert

Com certeza em algum momento da sua vida você já fez um commit na branch master e consequentemente sentiu aquela angustia de "ohhh shitt", e perdeu algum tempo pra conseguir reverter isso sem ter que avisar ninguém sobre a "arte".

xD


Bom estou deixando aqui dois comandos que podem te ajudar.

IMPORTANTE: SÓ REVERTE O ULTIMO COMMIT.

  • Reverte a última alteração do repositório git e mantem suas alterações do commit.
git reset --soft HEAD~1

  • Reverte a última alteração do repositório git e apaga suas alterações.
git reset --hard HEAD~1

Use com moderação rs

Até a próxima!

quinta-feira, 14 de abril de 2016

Integração Advpl x Excel #2

Integração Advpl x Excel #2

Fala galera!

No post anterior nós falamos sobre o início do programa que faz integração Advpl x Excel. Hoje continuaremos com o post a partir da função reportDef().

Vejamos o código antes de prosseguir:

static function reportDef

local oReport
local oSection
local oBreak

//configura o relatório
oReport := TReport():new("RELCLI","Lista de Clientes",,{|oReport| printReport(oReport)},"Lista de Clientes")
oReport:SetLandscape()  //orientação da página como paisagem
oReport:nFontBody := 10 //tamanho da fonte padrão
oReport:showHeader() //define que será exibido o cabeçalho do relatório
//cria uma seção   
oSection := TRSection():new(oReport,"Lista de clientes",{"SA1"})//importante descrever as tabelas utilizadas
oReport:setTotalInLine(.F.)

TRCell():new(oSection, "CLIENTE",,"")
oSection:cell("CLIENTE"):disable()

//define as colunas com o campo da tabela, tabela e cabeçalho que estará na planilha
TRCell():new(oSection, "A1_COD" , "SA1", "Cód. cliente")
TRCell():new(oSection, "A1_NOME", "SA1", "Nome cliente")
TRCell():new(oSection, "A1_END" , "SA1", "Endereço")
TRCell():new(oSection, "A1_MUN" , "SA1", "Cidade")
TRCell():new(oSection, "A1_EST" , "SA1", "Estado")
TRCell():new(oSection, "A1_PAIS", "SA1", "Pais")
      
return oReport

Bom, o que essa função faz basicamente? É responsável por toda a configuração inicial do seu relatório, ou seja, caso o usuário não deseje modificar alguma coisa, como impressão paisagem ou foto, o relatório assumirá a configuração definida nesta função.

Primeiro precisamos instanciar um objeto de TReport e, para isso, definimos o objeto oReport, onde este receberá as configurações iniciais do relatório.

TReport():new("RELCLI","Lista de Clientes",,{|oReport| printReport(oReport)},"Lista de Clientes")

Este método construtor, tem os seguinte parâmetros:

cReport: Nome do relatório. Exemplo: "RELCLI";
cTitle: Título do relatório;
uParam: Parâmetros do relatório cadastrado no Dicionário de Perguntas (SX1). Também pode ser utilizado bloco de código para parâmetros customizados;
bAction: Bloco de código que será executado quando o usuário confirmar a impressão do relatório;
cDescription: Descrição do relatório;
lLandscape: Aponta a orientação de página do relatório como paisagem;
uTotalText: Texto do totalizador do relatório, podendo ser caracter ou bloco de código;
lTotalInLine: Imprime as células em linha;
cPageTText: Texto do totalizador da página;
lPageTInLine: Imprime totalizador da página em linha;
lTPageBreak: Quebra página após a impressão do totalizador;
nColSpace: Espaçamento entre as colunas;


O construtor TRCell() é célula de impressão de uma seção (TRSection) de um relatório que utiliza a classe TReport. 

Para cada célula adicionada ao relatório é necessário chamar este método com a configurações necessárias com o objeto da seção, nome do campo, nome da tabela e título que será apresentado no arquivo excel.

Agora vamos implementar a função que irá efetuar a consulta no banco de dados, salvar em uma tabela temporária e adicionar ao objeto oSection do relatório.
Esta função definimos com o nome de printReport, que executará a impressão do relatório.

static function printReport()
    
local oSection := oReport:section(1)
local cSql := ""

oSection:init()    

//efetua a pesquisa no banco de dados. Neste caso, seleciona todos os clientes existentes
cSql := " SELECT A1_COD, A1_NOME, A1_END, A1_MUN, A1_EST, A1_PAIS "
cSql += " FROM "+RetSqlName("SA1")+"  SA1 "
cSql += " WHERE SA1.D_E_L_E_T_ = '' "   
cSql += " ORDER BY A1_COD "
    
//salva o código sql na pasta TEMP para consultas no seu SGBD
memoWrite("\TEMP\RELSA1.sql",cSql)                           
//Executa a query e cria uma tabela temporária (TRB)
dbUseArea(.T.,"TOPCONN",TCGenQry(,,cSql),"TRB",.F.,.T.)

oReport:setMeter(TRB->(recCount()))

TRB->(dbGoTop())

//percorre a tabela temporária e 'seta' os valores nas respectivas colunas
while !TRB->(eof())
 oSection:cell("A1_COD"):setValue(TRB->A1_COD)
 oSection:cell("A1_NOME"):setValue(TRB->A1_NOME)
 oSection:cell("A1_END"):setValue(TRB->A1_END) 
 oSection:cell("A1_MUN"):setValue(TRB->A1_MUN)
 oSection:cell("A1_EST"):setValue(TRB->A1_EST)
 oSection:cell("A1_PAIS"):setValue(TRB->A1_PAIS)
 oSection:printLine()
 oReport:incMeter()
 TRB->(dbSkip())
endDo
                  
oSection:finish()
TRB->(dbCloseArea())

return


O objeto oSection é iniciado através de seu método init(), onde é responsável por inicializar as configurações e define a primeira página de impressão.
Utilizamos a variável cSql para definirmos a query de consulta ao banco de dados que será posteriormente utilizada.

O método memowrite() é responsável por salvar o código sql que geramos em um diretório, no nosso caso será na pasta Temp do sistema. Este método é muito simples, basta informar a string contendo o diretório onde será salvo o arquivo, com nome e extensão; e a variável que possui o conteúdo a ser salvo.

Já o método dbUseArea() define um arquivo de dados como uma área de trabalho disponível na aplicação. Aqui nós definimos que trabalharemos com uma tabela temporária nomeada TRB, esta tabela terá todos os campos configurados no método reportDef(). Então para acessá-los basta usar a mesma sintaxe que usaríamos com uma tabela real do banco de dados.

Para mostrar ao usuário o andamento da impressão, utilizamos o método oReport:setMeter(TRB->(recCount())) que mostra uma régua de progressão.


//percorre a tabela temporária e 'seta' os valores nas respectivas colunas
while !TRB->(eof())
 oSection:cell("A1_COD"):setValue(TRB->A1_COD)
 oSection:cell("A1_NOME"):setValue(TRB->A1_NOME)
 oSection:cell("A1_END"):setValue(TRB->A1_END) 
 oSection:cell("A1_MUN"):setValue(TRB->A1_MUN)
 oSection:cell("A1_EST"):setValue(TRB->A1_EST)
 oSection:cell("A1_PAIS"):setValue(TRB->A1_PAIS)
 oSection:printLine()
 oReport:incMeter()
 TRB->(dbSkip())
endDo

O laço de repetição while percorre toda a tabela e adiciona o conteúdo dos campos da tabela TRB nas células respectivas. Após o final desse laço de repetição, a seção é encerrada, a tabela temporária é encerrada e a tela de impressão é exibida ao usuário.

Como vocês puderam acompanhar, não é um monstro de sete cabeças realizar essa integração. A linguagem Advpl é muito fácil de trabalhar, pois tem muitos recursos que permitem a alta abstração que nos permite evitar de se preocupar com configurações básicas ou mais complexas.

Então é isso aí! Até mais galera! Qualquer dúvida é só deixar um comentário que responderei assim que puder.

Código fonte completo em GitHub.

quarta-feira, 13 de abril de 2016

Debug #3 - iReport não abre


Fala galera!

Dica rápida para quem está com problemas ao executar o iReports.
Quando cliquei no ícone naturalmente abriu a tela splash e começou a carregar os módulos, mas sem mais nem menos o iReports é encerrado e nem a tela principal do programa é apresentado.

Então, após muitas pesquisas em vários sites, encontrei a solução. 
Acesse a pasta onde está instalado o iReports em seu computador e navegue até a pasta etc e dentro dela haverá o arquivo ireport.conf.

Abra este arquivo e altere a linha:

#jdkhome="/path/to/jdk"

Retire o # e adicione o diretório que possui o seu jdk instalado. 
O arquivo ficará dessa forma:

jdkhome="C:\Program Files\Java\pasta_jdk_aqui"

Pronto! Agora é só executar o iReports novamente e já estará disponível para uso.

Até mais!

Hangout PDJ - Como viver de Jogos no Brasil

Pessoal, olha que maravilha!

Pra quem perdeu eu perdi rs o Hangout de ontem (12), sobre "Como viver de Jogos no Brasil" que a equipe da Produção de Jogos organizou, segue o vídeo que disponibilizaram no youtube.
Vale muito a pena conferir...


E de quebra eu estou deixando um link pra quem se empolgar no vídeo, e resolver começar a "trabalhar" com jogos.
No link você encontra starter kits para começarem a produzir jogos, também da equipe "Produção de Jogos".

Link aqui: http://producaodejogos.com/11-starter-kits-incriveis-para-voce-comecar-produzir-seus-jogos/

E vamos nessa!

English NOW #3

Fala galera!

Continuando nossa série de posts com dicas de como aprender inglês sozinho, hoje estamos
com um dica muito legal do site CIG - O seu curso de inglês grátis.



Veja outras dicas com os posts anteriores:

English NOW #1

English NOW #2

Este site possui vários tópicos, onde são disponibilizados vídeos com dicas interessantes que
auxiliam os estudantes a aprender técnicas e métodos que possam dar resultado a seus estudos.

Existem vários cursos, cada um destinado à uma área específica de aprendizado do idioma, como
listening, phrasal verbs, leitura, gramática (básica e intermediária), entre outros.

Esse site possui um conteúdo riquíssimo para quer aprender e gosta do idioma. Manter-se nessa imersão durante os estudos ajuda, e muito, no aprendizado e na compreensão da língua.

Até a próxima!

Relatório iReports com JRBeanCollectionDataSource #1




Fala galera!

Bom esses dias precisei elaborar um relatório, mas como não havia necessidade de conexão com o banco de dados, então resolvi pesquisar sobre a classe JRBeanCollectionDataSource.

Como é informado no site da JasperReport, é comum acessar dados de aplicativos através de camadas de persistência de objetos como EJB, Hibernate, etc. Esses aplicações podem precisar gerar relatórios utilizando dados que já possuem disponível em matrizes ou em coleções de objetos JavaBean na memória.

Aqui trataremos de um tutorial com uma aplicação básica e a configuração do iReports.

Obs.: informo que estou utilizando o NetBeans IDE 7.3, iReports 5.5.1.


Criando novo projeto

Vamos criar um novo projeto no NetBeans, portanto vamos seguir o mesmo passo a passo de sempre:

File -> New project.



Aqui vamos utilizar uma aplicação Java (Java Application) e definiremos o nome do projeto como ReportDevIsComing.



Veja a seguir a estrutura final do projeto:


A primeira classe que será implementada é a classe Cliente. Esta classe possuirá os atributos referente aos clientes e esses atributos que serão utilizados/mostrados no relatório.

Classe Cliente

 // To change this template, choose Tools | Templates
 // and open the template in the editor.
package br.com.deviscoming;

/**
 *
 * @author renan.ramos
 */
public class Cliente {
    
     private int id;
    
    private String nome;
    
    private String endereco;
    
    private String estado;
    
    private String cidade;
        
   //metodos getters e setters 
   
}

Agora, precisamos implementar a classe que será responsável por fornecer os dados para o relatório, essa classe será definida como ClienteFactory. Para que o relatório funcione precisamos de um método estático (static) que irá "pegar" aos dados e retorná-los como um objeto da interface Collection.

Classe ClienteFactory

/**
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.deviscoming;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

/**
 *
 * @author renan.ramos
 */
public class ClienteFactory {
   public static Collection getCliente(){      
      return setCliente();
  }      
    
   private static Collection setCliente() {
       List clientes = new ArrayList();
       
       Cliente c1 = new Cliente();
       c1.setId(1);
       c1.setNome("Fulano da Silva");
       c1.setEndereco("Rua das Acácias");
       c1.setCidade("São Paulo");
       c1.setEstado("São Paulo");
       
       clientes.add(c1);
       
       Cliente c2 = new Cliente();
       c2.setId(2);
       c2.setNome("Beltrano da Silva");
       c2.setEndereco("Avenida Ipanema");
       c2.setCidade("Rio de Janeiro");
       c2.setEstado("Rio de Janeiro");
       
       clientes.add(c2);       
       
       return clientes;
    }   
}

Na segunda parte do post iremos tratar a configuração do relatório para que possamos exibí-lo
para o usuário.

Até mais!