terça-feira, 20 de setembro de 2016

JavaOne 2016 - 1 Dia



Opa, você tá sabendo que tá rolando lá em São Francisco entre os dias 19 e 22 de Setembro o maior evento de Java do planeta a tão falada JavaOne?

Você não sabia e perdeu o primeiro dia do evento?

Não se preocupe, nós do JavaBahia estamos ligados no evento e nesse post vamos ter uma breve introdução sobre cada apresentação e claro o link do video da mesma, graças a boas ideias podemos assistir tudo o que tá rolando do sofá de nossas casas, todas as apresentações estão sendo públicas por streaming no Youtube. Lembrando que todas as apresentações da JavaOne estão em inglês e não possuem legenda.

Caso você queria estar acompanhar de mais perto então entre no Twitter e procure por #JavaOne, @javaoneconf ou @javabahia.

O que rolou na Ballroom 4?

1º - Learn Java 8: Lambdas and Functional Programming

Henri Tremblay abriu nosso dia apresentando para a comunidade as mudanças que ocorreram na linguagem com a chegada do Java 8 e como trabalhar com o Paradigma Funcional no Java, tudo isso com vários exemplos codificados durante a apresentação.



2º - JDK 9 Language, Tooling, and Library Features

Depois foi a vez do Joseph Darcy nos apresentar o projeto Jigsaw e como o Java 9 estar se adaptando para trabalhar com modularidade. O javac não ficou de fora do evento e foi apresentado como essa ferramenta vai poder realizar um cross-compile para versões mais velhas do Java e como foi melhorado o suporte a inferência de tipos. Joseph Darcy também apresentou como vamos poder utilizar o Javadoc daqui pra frente que estar recebendo suporte ao HTML5 e uma caixa de pesquisa.



3º - Prepare for JDK 9

Para complementar a apresentação do Joseph, Alan Bateman nos apresentou os benefícios que o Java 9 trará a linguagem com o suporte a modularização. Além de nos mostrar APIs que ficaram depreciadas, APIs que sofreram modificações e as que ficaram intactas. Esta apresentação nos mostrou como preparar nosso código para JDK 9 e o que vai estar disponível para nos ajudar nessa migração.


4º - Introduction to Modular Development

Sim! Mais uma apresentação do Alan Bateman, na verdade essa apresentação é um complemento da anterior. Só que agora ele nos explica o conceito e o porquê de se trabalhar com sistemas modularizados, além de nos apresentar um exemplo de como modularizar nossa aplicação, realizar testes e executar.



5º - Using Oracle Java Flight Recorder in an Autonomous Robotic Vehicle

Não assistir essa sessão quando ela começou eu resolvi ir para Ballroom 6. Mas caso você tenha interesse em saber como o Java vai trabalhar com a IoT, como é possível obter uma quantidade significativa de dados de sensores, então essa sessão é pra você porque aqui foi mostrado como usar o Oracle Java Flight Recorder com recursos escassos e onde a sobrecarga pode causar problemas significativos.



6º - Advanced Modular Development

Se as 3 primeiras sessões foram interessantes para entendermos como chegamos no
Java 9, essa daqui foi muito útil para nos mostrar como podemos desenvolver bibliotecas, aplicações modulares e o mais uma vez foi apresentada uma forma de pegarmos nosso código e migra-lo. O diferencial dessa apresentação foi poder entender quais os desafios nos aguardam nesse tipo de projeto, além de nos mostrar como podemos desenvolver uma biblioteca sem esperar que a biblioteca que dependemos já estava adaptada aos sistemas modulares.



7º - Using Type Annotations to Improve Your Code

Essa aqui era a apresentação mais esperada por mim, mas infelizmente não consegui achar o streaming dela :(
O motivo do meu interesse era por essa apresentação era pra aprender como o Java 8 nos fornece o poder de adicionar anotações para diversos usos no nosso sistema.

E na Ballroom 6 aconteceu o que?

1º - Rapid Development Tools for Java EE 8
Uma apresentação bem interessante que assistir antes de ir dormir. Nela foi mostrado como o NetBeans IDE evoluiu e passou a trazer velocidade no desenvolvimento de aplicações Java EE, sendo totalmente viável criar uma nova aplicação do zero em poucos minutos sem a chatice de muitas configurações.



2º - Developing Java Applications with Eclipse Neon
Mais uma apresentação que preciso assistir, utilizo o Eclipse IDE no meu dia a dia e estou evitando migrar para o Neon, nessa sessão foi apresentada alguns dos novos recursos da IDE e levantamentos de outras tecnologias que estão sendo desenvolvidas para aprimorar a estrutura de projetos, execução e ferramentas de modelagem.



3º - Docker Support in NetBeans, Eclipse, and IntelliJ

O Docker tá bombando, se tornou um dos tópicos mais abordados nos últimos meses. Era meio óbvio que ele estaria presente de alguma forma na JavaOne, essa apresentação nos apresentou como o Docker está preparado para trabalhar em conjunto com as três IDEs mais utilizadas para desenvolvimento em Java



4º - JUnit5: Features, Architecture, and Extensibility

Esse foi só o primeiro dia de evento e a minha lista do que vou assistir só faz aumentar. O JUnit é uma importante ferramenta pro mundo Java quando a gente fala em realizar testes unitários, nessa apresentação foi mostrado como podemos atualizar nossos testes para atender as necessidades do Lambda. Outras coisas interessantes que foram mostradas é a maneira de preparar os testes para uma arquitetura modularizada. Tudo isso com exemplos bem práticos, então é ta ai mais uma apresentação pra minha lista.



5º - Introduction to Troubleshooting in JDK 9: Serviceability Tools Are Your Friends

OpenJDK possui várias ferramentas para depuração e solução de problemas como por exemplo jmap, jstat e o jdb. Agora com o JDK 9, essas ferramentas têm obtido novas funcionalidades. Nessa apresentação podemos aprender como utilizar essas ferramentas para solução de problemas, pelo que li no Twitter ela foi um campo de treinamento sobre como solucionar problemas no JDK 9.



6º - Automated Tuning of the JVM with Bayesian Optimization

Sem interesses da minha parte aqui… Mas para aqueles que curtem ajustar e modificar a JVM para ficarem automatizadas aos seus sistemas, recomendo que assistam e vejam como utilizar a metodologia de otimização Bayesiana.



7º - Java 9 Module System Support in the NetBeans IDE

Olha o NetBeans IDE aparecendo novamente, infelizmente não achei o link desta apresentação, não tenho informações do que aconteceu por aqui.

8º - Tools for High-Performance Polyglot Programming on the JVM

Outra apresentação que fiquei sem link e sem informações, foi mal galera :(

Bem esse post foi um resumo do que eu conheci acompanhar no primeiro dia do evento, infelizmente as salas Cyrill Magnin II/III e Embarcadero vão ficar de fora desse post, porque não sei o que aconteceu nelas.

Se alguém tem alguma informação e quiser compartilhar, me procura por favor :)

 

segunda-feira, 12 de setembro de 2016

Encontro Java Bahia na Ruy Barbosa 24/09/2016

O JavaBahia juntamente com a Faculdade Ruy Barbosa (Anfiteatro) vai promover nesse mês um encontro para disseminar a cultura de desenvolvimento Java na Bahia, não deixe de participar!
O Evento é gratuito, mas as vagas são LIMITADAS e para entrar nas dependências da faculdade é necessário informar o RG, por isso não deixe de informar o seu RG quando se cadastrar neste evento.
Vamos conversar sobre:
* Java User Group – O que é e como eu posso participar? - Jefferson Moreira
* JPA de A à Z: Porque conhecer a JPA?
* Carreira do desenvolvedor Java: O que eu preciso saber? - Antônio Lázaro
* Spring Data - Ivan Queiroz

Se inscreva acessando o link: http://www.meetup.com/Java-Bahia/events/234079337/

quarta-feira, 31 de agosto de 2016

Encontro JavaBahia - 14 de Setembro 2016



O JavaBahia juntamente com a FTC de Feira de Santana promoverá um encontro no dia 14/09 visando disseminar a cultura de desenvolvimento Java. Nesse encontro vão ser abordados temas como comunidade Java, JVM, especificação JPA e no final todos ficaram disponíveis para uma boa conversa em que todos poderão tirar dúvidas e compartilhar suas experiências.
O evento é gratuito. Participe!
Também estamos presentes no Meetup: http://www.meetup.com/Java-Bahia/

segunda-feira, 22 de agosto de 2016

Encontro JavaBahia - 27 de Agosto 2016 - Auditório Unijorge Comércio - Inscrições Encerradas

Retomando o ciclo de atividades de 2016, teremos nossa reunião presencial agora em Agosto, que vai acontecer no Auditório da Unijorge no Comércio, na Rua Miguel Calmon, 42, Edf. São Paulo. Mas não é só isso: Preparamos conteúdos super interessantes pra você!!! Dá uma conferida:
  • Java User Group – O que é e como eu posso participar? - Jefferson Moreira
  • Comunidade Java no mundo - A experiência de um membro do nosso JUG - Otávio Santana
  • Carreira do desenvolvedor Java: O que eu preciso saber? - Antônio Lázaro
  • JPA de A à Z: Porque conhecer a JPA? - Mateus Malaquias
  • Encerramento - Neste momento temos um espaço aberto para você contribuir e falar o que quiser!!!
Ok, mas como eu faço pra participar?

Precisamos enviar os nomes dos inscritos para a segurança da Unijorge, portanto tivermos que encerrar as inscrições para este encontro. Mas não fique triste, em Setembro teremos mais um encontro. Fique ligado no site do JavaBahia!!!

As inscrições estão sendo feitas pelo formulário no link https://goo.gl/forms/gyTykV1OXyPQ7REu1, então corre lá e garante sua vaga, porque são limitadas!!!



Ah, já ia me esquecendo: Através da parceria com os cursos tecnológicos da Unijorge, poderemos emitir certificado. Já dá uma força na carga horária!

Encontro JavaBahia - Agosto/2016
Local: Auditório da Unijorge Comércio Prédio IV - Rua Miguel Calmon, 42, Edf. São Paulo - Comércio Salvador-BA CEP: 40.015-060 71 (https://goo.gl/maps/oFTN5rpo3YU2)
Data: 27/08/2016 (sábado), das 09:00 às 12:00



quarta-feira, 3 de agosto de 2016

JPA de A à Z - Vantagens e Desvantagens

No post anterior tentei instigar você a conhecer a JPA e a entender o motivo dessa especificação ser tão utilizada atualmente. No post de hoje vamos analisar as vantagens e desvantagens dessa especificação, a ideia é que com o pouco da minha experiência passemos a entender que toda solução pode se torna um fardo se utilizada incorretamente. Sinta-se convidado a compartilhar suas experiências nos comentários.

  • VANTAGENS:
  1. Indepêndencia: Utilizando JPQL ou Criteria conseguimos ter uma indepêndencia com os bancos de dados porque agora fica a cargo da implementação da JPA em converter sua consulta em SQL nativo. Agora as ações básicas de insert, update e delete também ficam por conta da implementação. Com isso podemos criar uma única aplicação que vai se comunicar com diversos bancos de dados.
  2. Reduz a necessidade de conhecer SQL: Não me leve a mal, ainda penso que conhecer pelo menos o básico de SQL é fundamental para qualquer programador. Todavia você consegue trabalhar com a JPA sem esse conhecimento.
  3. Dê adeus a conversão de querys em objetos: No post anterior você teve um gostinho do trabalho que braçal necessário para se obter um objeto com o JDBC. Justamente para não perdemos mais tempo com isso nasceram as implementações da JPA que são capazes de realizar esse trabalho para gente.
  4. Otimização automática: Nem sempre temos o trabalho de otimizar uma consulta, mas esse é um ponto que considero critico porque muda de implementação para implementação e nem sempre temos o resultado desejado. Caso você precise ter um sistema em que as consultas sejam sempre otimizadas recomendo que utilize o Batoo no lugar do Hibernate por exemplo.
  5. Cache de dados: Cache de dados é muito util para diminuir a quantidade de requisição ao banco de dados, o chace de dados também faz com que o desempenho da sua aplicação melhore caso você tenha cuidado com o custo de RAM necessário.

Não me leve a mal a JPA é uma ferramenta muito poderosa e muitas vezes pensamos que ela é a solução para tudo, também não é incomum querer resolver todos os problemas do mundo com ela. Não vejo nada de errado nisso, desde que sempre se preocupe com os pontos abaixo:

  • DESVANTAGENS:
  1. Base de dados legada: Nem sempre foi possível executar triggers, functions e procedures direto no banco de dados. Atualmente podemos fazer isso, todavia temos que ter cuidado com o impacto que isso pode gerar ao modelo objeto-relacional e a indepêndencia a respeito dos bancos de dados. Hoje em dia por exemplo passo boa parte da minha atividade migrando e otimizando procedures no Java justamente por isso.
  2. Chaves compostas: AH! Que raiva tenho de utilizar @embedded, trabalhar com chaves compostas na JPA significa aumentar drasticamente a complexidade de nossas entidades. Em determinadas situações para executar um update ou insert por exemplo precisamos gerar muito mais código.
  3. Curva de aprendizado para além do básico: Fazer o feijão com arroz utilizando JPA é fácil e muito pratico, isso é bom porque atrai sempre novas pessoas. Mas quando passamos para um nível mais avançado como por exemplo utilizar chaves compostas, chace, criteria e relacionamentos bidirecionais as pessoas começam a encontrar diversas dificuldades. Esse aqui é justamente um dos motivos de existir a serie JPA de A à Z aqui no blog.
  4. Indepêndencia facilmente quebrada: Quebrar a indepência de banco não é difícil. Alguma vezes não tem jeito e precisamos apelar para o SQL nativo seja porque a otimização com a especificação não ficou suficientemente boa ou ate mesmo quando precisamos fazer uma união de consultas.
  5. Unir consultas: Esse pra mim é o defeito mais grave na especificação, simplesmente não conseguimos realizar união de consultas. Claro que podemos utilizar alguns artifícios para simular uma união, mas na grande maioria das vezes é necessários optar pelo SQL nativo e ai vai embora a independência de banco de dados.

Enfim, hoje quis apresentar a vocês o meu ponto de vista sobre a JPA de uma forma mais detalhada por meio das minhas experiências com a especificação. Claro que a JPA não deixa de ser uma arma poderosa mesmo tendo essas desvantagens, por isso fica aqui o meu apelo para que ocorra um planejamento ao utilizar a JPA.

segunda-feira, 25 de julho de 2016

JPA de A à Z - Por que conhecer?

Não dá pra negar que o Java é uma linguagem bastante verbosa e quando falávamos em juntar o Java com um banco de dados ai sim dava pra ver o tamanho do problema.
Se não tivéssemos cuidado era muito fácil perder o controle da complexidade de nossas entidades e consultas.

Antes de entendermos sobre a  JPA, é necessário entender que costumávamos utilizar em nossos projetos o JDBC (Java Database Connectivity) que é uma API presente no Java desde a versão 1.1 da plataforma. Mesmo sendo uma API bem antiga ela ainda continua sendo atualizada e modificada pela comunidade e pela Oracle.

Resumidamente o JDBC é o antecessor da JPA porque ela era a principal forma de executar nossas querys SQL de select, update, delete, insert e até mesmo executar funções presentes no banco de dados. Um detalhe interessante sobre o JDBC são seus Drivers de conexão, sendo cada banco de dados é responsável por desenvolver e atualizar o seu Driver. Isso facilitava muito a vida do desenvolvedor porque esses Drivers visam encapsular boa parte do código necessário para se conseguir uma conexão, então era uma preocupação a menos que tínhamos que ter.

Mas nem tudo eram flores quando usávamos o JDBC, porque além de ter que escrever códigos SQL direto no Java, tínhamos também que instanciar uma conexão, buscar a conexão com o banco de dados. Dai era preciso preparar um outro objeto para poder manipular a consulta informando os valores dos parâmetros e só então executávamos a consulta.

Acabávamos tendo um trabalho tedioso só para executar uma consulta, todavia o ciclo não acabava nisso, depois era preciso fazer um casting do retorno da consulta para com objeto que queríamos manipular e como se não fosse suficiente também era necessário lembrar de fechar as conexões com o banco de dados.
É preciso entender que estamos falando de muito tempo atrás, um tempo em que as facilidades da JPA ainda não existiam e que muita especificação que existe hoje nasceu das dificuldades do passado.

public class ProdutoDAO {

Connection dbConnection;

public ProdutoDAO(Connection con) {
this.dbConnection = con;
}

public void salva(Produto produto) throws SQLException {
String sql = "INSERT INTO PRODUTO (NOME, DESCRICAO) VALUES (?,?)";

try (PreparedStatement prStmt = dbConnection.prepareStatement(sql,
Statement.RETURN_GENERATED_KEYS)) {

prStmt.setString(1, produto.getNome());
prStmt.setString(2, produto.getDescricao());
prStmt.execute();

try (ResultSet rs = prStmt.getGeneratedKeys()) {
if (rs.next()) {
int id = rs.getInt(1);
produto.setId(id);
}
}

}
}

public List lista() throws SQLException {
List produtos = new ArrayList();

String sql = "SELECT * FROM PRODUTO";

try (PreparedStatement prStmt = dbConnection.prepareStatement(sql)) {
prStmt.execute();

converterQueryEmProdutos(produtos, prStmt);
}

return produtos;
}

public List busca(Produto produto) throws SQLException {

String sql = "SELECT * FROM PRODUTO WHERE DESCRICAO like ?";
List produtos = new ArrayList();

try (PreparedStatement prdStmt = dbConnection.prepareStatement(sql)) {
prdStmt.setString(1, produto.getDescricao);
prdStmt.execute();

converterQueryEmProdutos(produtos, prdStmt);
}

return produtos;
}

private void converterQueryEmProdutos(List produtos, PreparedStatement prdStmt) throws SQLException {

try (ResultSet rs = prdStmt.getResultSet()) {
while (rs.next()) {
int id = rs.getInt(1);
String nomeProduto = rs.getString("nome");
String descricaoProduto = rs.getString("descricao");
Produto produto = new Produto(nomeProduto, descricaoProduto);
produto.setId(id);
produtos.add(produto);
}
}
}
}

Olhando pra esse código podemos passar um baita sufoco se por acaso algum dia o analista de requisitos resolva mexer nos atributos da entidadeProduto. Nessa DAO de exemplo só foi criada poucas consultas, mas vamos usar nossa criatividade e imaginar que na verdade existem 10 e o analista resolveu mudar o nome da coluna "DESCRICAO" para "TIPO_PRODUTO", uma pequena mudança de nomenclatura já é suficiente para que perdêssemos tempo refatorando boa parte de nosso código.

Foi para evitar todo esse trabalho que surgiu o conceito ORM (Object Relational Mapping) que traduzindo livremente de acordo com a minha vontade quer dizer: “Estou salvando a sua alma transformando os dados de um banco de dados que estão no paradigma relacional para o paradigma orientado a objetos que você tanto precisa”.

Junto com a ORM também surgiu o Hibernate que é o framework JPA mais famoso e utilizado no momento. Só por curiosidade saiba que a JPA surgiu por causa dele, viram que a ideia era tão boa que resolveram transformar a implementação do Hibernate em uma especificação e até hoje muita coisa que é implementada no framework posteriormente vira especificação na JPA.

Mas o que é JPA?

JPA significa Java Persistence API e como já falei ela é uma especificação que nasceu de uma JSR (Java Specification Requests) que basicamente são pedidos para mudanças na linguagem, entenda a JPA como um contrato, normas, regras ou interface e que todos os Frameworks Java que trabalham com persistência de dados devem implementa-la. Além do Hibernate também temos outros Framworks como por exemplo o OpenJPA, o Batoo e o EclipseLink.

Então basicamente a JPA é uma especificação que regulamenta ferramentas muito poderosas que utilizamos no nosso dia a dia para automatizar e economizar tempo de desenvolvimento. Essa especificação nos ajuda em todos os processos quando precisamos trabalhar com um banco de dados, sendo assim podemos usa-la para executar consultas, inserts, updates e deletes.

Lembra daquele código verboso? Como sera que ele ficaria se fosse escrito utilizando a JPA?

 
public Produto obterPorId(Produto produto) {
return manager.find(Produto.class, produto.getId());
}

@SuppressWarnings("unchecked")
public List obterTodos() {
return manager.createQuery("SELCT p FROM Produto p").getResultList();
}

Repare que no método obterPorId não foi necessário criar uma única query SQL para executar a consulta por ID, também não foi preciso fazer nenhum casting a JPA se encarregou de fazer tudo isso pra gente. Agora olhando o método obterTodos temos uma String que se parece muito com uma query SQL só que não é, a essa String damos o nome de JPQL (Java Persistence Query Language) e vamos conhecer mais sobre ela em outro momento.

Por fim espero que você nos acompanhe nos próximos posts porque vamos aprender mais sobre essa ferramenta poderosa em conjunto com boas práticas. A ideia é de que os posts não sejam muito longos e também não sejam só tutorias de JPA, aqui iremos explorar os conceitos, apresentar exemplos e colocar minha experiência em ação com as boas práticas.

segunda-feira, 25 de janeiro de 2016

Palestras confirmadas [Linguagil 2016]



Você já viu a grade de palestras do LinguÁgil 2016? Como sempre, ela está bem misturada, trazendo diversos assuntos ligados a linguagens de programação, frameworks, agilidade, comportamento e carreira.

Além da participação da comunidade através das apresentações submetidas e selecionadas, mais uma vez, teremos "keynotes", com palestrantes de referência. Outro fato importante é que pelo menos um terço das apresentações será feito por mulheres, numa ação para demonstrar como a participação feminina é necessária e muito bem-vinda.


Sexta, 18/03/16:



  • 08:50 às 09:35 - O trabalho de FDP do PO: fatiar, descartar e priorizar! (Mila Orrico)
  • 10:15 às 10:35 - SBTM - Testes exploratórios guiados à sessão (Lorena Caldas)
  • 10:45 às 11:30 - Construindo aplicativos móveis com Ionic Framework (Isaque Dias)
  • 11:30 às 12:15 - DevOps é uma prática, cultura ou um cargo? (Carlos Felippe Cardoso)
  • 13:45 às 14:30 - Programação Reactiva (Osvaldo "Tupy" Matos)
  • 14:50 às 15:35 - Como empreender tendo um emprego? (Paula Antunes)
  • 16:05 às 16:50 - Dobro do Resultado na Metade do Tempo (Rafael Miranda)
  • 16:50 às 17:35 - Histórias de Usuário - Por que e como escrever requisitos de forma ágil? (Rafael Helm)



Sábado, 19/03/16:



  • 08:50 às 09:35 - Controlefobia (Juliano Ribeiro)
  • 09:35 às 09:55 - Hackeando Representatividade: Mulheres Empreendedoras (Ana Paula Vargas Maia)
  • 10:15 às 10:35 - Quero ser um certificado Scrum! Porque ter e o que devo fazer para ter? (Adriana de Melo Fontes)
  • 10:45 às 11:30 - Resiliência, a competência que nos leva a excelência (Anneliese Gripp)
  • 11:30 às 12:15 - Computação Ubíqua, o que isso tem a ver com Android Wear. (Ramon Mota)
  • 13:45 às 14:30 - Empreendendo com Software Livre. (Francine Grando)
  • 14:50 às 15:35 - Programação funcional com Java 8 (Otávio Santana)



Visite a página do evento, veja mais informações e se inscreva: http://linguagil.com.br