Blog

Automatizando seu DB com FlyWay Plugin – MySql

Olá Pessoal,

No post de hoje vou mostrar para vocês como podemos automatizar a criação de um banco de dados usando o plugin flyway. Aqui na ITS temos usado o plugin para aumentar a produtividade e sempre manter a integridade dos ambientes.

Lets go…

O problema

Há várias ferramentas e formas de automatizar a criação das tabelas do banco com cenários já prontos ou até vazios.  Aqui na ITS, para os projetos Java temos usado o flyway, apesar de que testamos outras como o DBMaintain, mas optamos pelo plugin flyway, já que em termos de resultado final era semelhante ao dbmaintain, porém a curva de aprendizado e configuração  era mais rápida.  Para projetos Ruby, estamos vendo outra solução.

O problema que tínhamos aqui era a criação da base de dados para cada ambiente, desde local até ambiente de INT, DEV e PROD. A modelagem do banco pode mudar (e certamente vai) e quando isso acontece, o problema está feito. Como atualizar cada ambiente rapidamente?

Opção 1

Criar um dump do banco e rodar o .sql em cada ambiente manualmente.

Opção 2

Automatizar esse processo de update.

Nesse post vamos nos limitar apenas em como gerar a base de dados rapidamente. Em outro post veremos como atualizar outros ambientes através de uma ferramenta de build continuous como o Jenkins. 

A opção 1 funciona, mas não é a ideal, pois é preciso logar em cada ambiente e rodar o .sql. Isso consome tempo e é chato de fazer, ninguém gosta de fazer esse trabalho repetitivo. E se o banco durante o dia mudar 3 ou 4 vezes? Quantas vezes você vai executar a opção 1? Se você tem 3 ambientes para atualizar será preciso fazer isso 3 vezes a cada mudança. Péssimo, não? 

A opção 2

Você pode automatizar. Há ferramentas que ajudam a fazer isso usando um Servidor de Build como o Jenkins ou até como plugin maven.  Já usei o dbmaintain, mas analisando outras opções encontrei o flyway, até porque o desenvolvedor pode rodar o plugin local e se tiver o banco de dados rodando em segundos ele tem o ambiente local atualizado.

Configurando o FlyWay  via Maven

Antes de tudo você precisa ter um arquivo .sql que irá criar as tabelas e ele deve estar nessa estrutura: src/main/resources/db/migration

flywaysql

E o nome do arquivo tem que ser V1__QUALQUERNOME.sql

São 2 underscore. Se seu banco mudou você precisa ter um V2 e assim por diante. O flyway faz um tracking disso e salva em uma tabela schema_version. Se você tem mais de um ambiente, sugiro dar uma lida nesse post:

http://lwandersonmusings.blogspot.com/2012/07/using-maven-to-integrate-flyway.html

Vamos ver na prática um simples exemplo. Vou considerar que você já tem um projeto Maven

Step 1

Abra o pom e adicione:

<plugin>

                           <groupId>com.googlecode.flyway</groupId>

                           <artifactId>flyway-maven-plugin</artifactId>

                           <version>2.2.1</version>

                           <configuration>

                                  <url>jdbc:mysql://localhost:3306/seu_database</url>

                                  <user>camilo </user>

                                  <password>2014</password>

                           </configuration>

                           <dependencies>

                                  <dependency>

                                        <groupId>mysql</groupId>

                                  <artifactId>mysql-connector-java</artifactId>

                                        <version>5.1.25</version>

                                  </dependency>

                           </dependencies>

                    </plugin>

 

 Step 2

Garanta que o banco foi inicializado.

Step 3

Garanta que o database exista, caso contrário o flyway não vai conseguir conectar.

flywaydatabase

Step 4

via command line (se preferir pode usar o Eclipse) digite o seguinte comando:

flywaycommandmigrate

Step 5

Veja o resultado:

flywaycommandmigrateresult

 

flywaytablecreated

Observe que as tabelas foram criadas. Tive que ocultar os nomes das tabelas. 

Simples não?

Alguns comandos básicos

mvn flyway:clean

 

Limpar o Database, ou seja, todas tables são apagadas.

mvn flyway:info

 

Mostra quando o último script foi rodado e o status.

mvn flyway:migrate

 

Faz a migração, ou melhor, executa o .sql em si.

Note: Você pode usar o recurso de profiles e ter diferentes execuções para o flyway.

O flyway tem se mostrado um plugin muito bom no dia a dia e atendendo aos requisitos que precisamos, sem falar que tem uma boa documentação e os posts no blog deles tem sido bem mão na massa. 

Abraços, see ya!! 

Criptografando senha com Spring Security

Olá Pessoal,

No post de hoje vamos ver como criptografar senha usando o Spring Security. O objetivo é que a senha do usuário não seja salva no seu BD, e já sabemos o motivo de fazer isso. Não vou entrar nos detalhes.

Lets go

Requisitos

  • Baixe a versão mais recente do SpringSecurity. (Para o post estou usando a versão 3.2.x)

Starting

Há várias soluções na internet, desde usando o Java puro ou usando APIs, Frameworks para criptografar a senha, e para quem está usando o SpringSecurity no projeto tem uma vantagem: já tem uma classe implementada pelo pessoal do Spring que faz isso em 1 linha. Vejamos a classe que criei a seguir para fazer isso. Vejam como é simples:

public abstract class GenerateHashPasswordUtil {       

        private static Object salt; 

        public static String generateHash(String password) {

                MessageDigestPasswordEncoder digestPasswordEncoder = getInstanceMessageDisterPassword();

                String encodePassword = digestPasswordEncoder.encodePassword(password, salt);

                return encodePassword;

        } 

        private static MessageDigestPasswordEncoder getInstanceMessageDisterPassword() {

//informo tipo de enconding que desejo

MessageDigestPasswordEncoder   digestPasswordEncoder = new MessageDigestPasswordEncoder("MD5");

                return digestPasswordEncoder;

        }

        //método que faz a validação  como não usamos salt deixei em null

        public static boolean isPasswordValid(String password, String hashPassword) {

        MessageDigestPasswordEncoder digestPasswordEncoder = getInstanceMessageDisterPassword();

                return digestPasswordEncoder.isPasswordValid(hashPassword, password, salt);

        }

}

 

E aqui a classe de teste que valida alguns cenários:

public class GenerateHashPasswordUtilTest { 

       @Test

       public void testHashWasGenerateWithSuccess() {

             String password="1234";

             assertNotNull(GenerateHashPasswordUtil.generateHash(password));

       }

       @Test

       public void testValidIfPasswordIsValidAfterHashed(){

             String password="brazil";

              String hashPassword =GenerateHashPasswordUtil.generateHash(password);

 boolean expectedValidPassword = GenerateHashPasswordUtil.isPasswordValid(password, hashPassword);

             assertTrue(expectedValidPassword);

       }

       @Test

       public void testPassWordIsNotEqualToHashCodeGenerated(){

             String password = "XPto";

             String passwordhash = GenerateHashPasswordUtil.generateHash(password);

             String passwordTyped = "xPto";

             boolean expectedInvalidPassword = GenerateHashPasswordUtil.isPasswordValid(passwordTyped, passwordhash);

             assertFalse(expectedInvalidPassword);

       } 

}

 

 Simples, não? Se quiser ver o código hash basta imprimir no console.

Abraços, vou ficando por aqui.

Treinamento in Company

 
Olá Pessoal,
 
O post de hoje é bem extra. Quero aproveitar e compartilhar com vocês um novo serviço que estamos oferecendo para empresas através da minha start-up (ITS), que é o Treinamento In Company.
 
Overview 
 
Desde dos 15 anos sempre atuei de maneira exporádica com treinamentos técnicos e sempre que posso estou ministrando algum treinamento com o objetivo de ajudar, compartilhar e aprender com quem está no mesmo caminho que um dia já estive. Nos últimos meses tenho recebido alguns convites para ministrar treinamentos (TDD, Agile, Scrum, AngularJS, etc) In Company, com o objetivo de ajudar as equipes de maneira prática compartilhando o que tenho aprendido com os projetos aqui na empresa. Para atender essa necessidade e evitar aqueles treinamentos triviais e chatos com bastente teoria, uso toda a experiência e conhecimento dos problemas que passamos nos projetos da ITS. Não conhece a ITS? É uma start-up  com foco em criação de produtos web e mobile para outras start-ups.
 
Mas como funciona o treinamento? 
 
O treinamento é realizado na empresa do cliente ou local escolhido pelo mesmo.
 
O que tem de especial no treinamento? 
 
O conteúdo do treinamento não é fixo. Antes de montarmos a carga horária e o conteúdo precisamos entender a necessidade do nosso cliente, entender como aquela tecnologia ou técnica que ele deseja o treinamento pode agregar valor no dia a dia da equipe e ao negócio. Então o treinamento é direcionado ao negócio específico de cada cliente.Todos os treinamentos são no modelo workshop.
 
Após o treinamento oferecemos mentoria sem custo ao cliente, ou seja, ao concluir o treinamento, caso o cliente deseje, o instrutor permanece por 2-3 dias acompanhando a equipe e fornecendo consultoria nos projetos reais da empresa e como aplicar o que foi aprendido no curso.
 
Quais treinamentos disponiveis? 
 
  •  Scrum com Team Remotos
  •  TDD na Prática
  • Iniciando AngularJS para Desenvolvedores Java
  • Continuous Integration com Jenkins
  • Mão na massa com Git
 
Quer mais detalhes?
 
Entre em contato através do e-mail contato@itscompany.com.br 
 

Série Dropbox Case com dropbox API

Olá Pessoal

No post de hoje gostaria de compartilhar com vocês uma experiência que tivemos aqui na ITS usando API do DropBox para resolver alguns problemas e facilitar a vida do usuário. Aqui no blog já apresentei para vocês como  usar API do Dropbox, hoje veremos como fazer umas coisas legais na sua aplicação.

Lets go…

Starting…

Case 1

Em um projeto aqui na ITS tínhamos que renderizar imagens em algumas páginas da aplicação e queria fazer isso de maneira simples, fácil e transparente para o usuário final. Considerando que o usuário que coloca as imagens não precisasse conhecer a aplicação, ou melhor, ele poderia nem ter idéia onde aquela imagem que ele criou seria usada, o foco dele era fazer a criação e depois de pronto disponibilizar a imagem em folder chamado de “live” e pronto.  Essa imagem já estaria atualizada na aplicação automaticamente.

Como resolvemos esse problema sem precisar envolver o design com aplicação?

Simples, usando o DropBox.

É isso mesmo. Os designers usam o dropbox para colocar a arte final e uma pasta final onde outro designer faz um review para ver se está ok. Nada de especial aqui, apenas usando o dropbox de maneira tradicional, só que a arte final desse designer ia ser usada na aplicação e precisamos subir a imagem, como fazer?

  • Via upload na aplicação; ou
  • Colocar a imagem direto no servidor e dar uns tapas na app para reconhecer a nova imagem

E o que fizemos?

Usamos dropbox. Para ser sincero eu fui dormir com esse problema, sonhei, e veio o dropbox como solução. Passei alguns dias estudando API e fazendo POC para validar a solução.

A solução

A solução é muito simples: o design vai continuar fazendo o trabalho dele como antes, a aplicação apenas vai buscar imagens na pasta “live” que é uma pasta onde tem a versão final da arte. Daí se o designer fizer alguma alteração nessa imagem, automaticamente ela é atualizada na aplicação. E não precisamos nos preocupar em fazer um novo upload da imagem no servidor  com a versão atualizada, porque há um sync com  a pasta “live”. A esta pasta “live” não é qualquer um que possui acesso, somente Designers mais Seniors tem permissão de escrita nessa pasta. Futuramente vamos facilitar a vida dos designers e implementar um esquema de automatizar os deploys de imagem nessa pasta, mas por enquanto ela ocorre manual. 

O que ganhamos?

– Nada de imagem no Server, então em uma migração de Server não preciso ficar preocupado em copiar imagens e, a depender da quantidade e tipo de negócio, pode demorar a cópia. Quantas imagens você acha que o submarino possui?

– Mais produtividade para o designer. Ele continua focado no trabalho dele fazendo tudo como antes, sem se preocupar onde e quem vai usar aquela imagem;

– Atualização automática da imagem na aplicação. Ou seja, subiu a imagem para pasta “live” já está atualizada na aplicação.

Case 2

Esse aqui também foi fantástico em outro projeto que usava  bastante documentos durante o dia. A vida dos usuários era o Microsoft Word aberto, atualizando os documentos publicados, criando novos  ou corrigindo.  Na versão atual, sempre que um documento é corrigido por uma questão de mudança de lei ou cláusula de contrato, há um prazo de publicação que, a depender da situação, é de até 8hrs a disponibilidade.  Se fosse apenas 1 documento e se acontecesse isso em um período longo, seria fácil, mas não é assim no dia a dia. Hoje o nosso cliente tem que acessar a aplicação, deletar o arquivo anterior e fazer upload do novo. E pior, é interessante manter o antigo como backup, por questão de segurança o delete não remove o arquivo do servidor, apenas move para uma pasta específica. Então o pessoal que trabalha nesses documentos passava boa parte do tempo fazendo upload, fora que às vezes enfrentavam problemas e demora nesse processo, já que tinham arquivos com 10 mb, como projetos com imagens.

E como resolvemos?

Com dropbox API. Os usuários trabalham no dropbox com limitação de acesso, vendo apenas aqueles folders de acordo com o departamento.  Eles não precisam mais se preocupar em fazer upload, apenas trabalham nos docs em uma determinada pasta. Seus superiores podem ir avaliando o documento sendo escrito e já dando feedback. Uma vez concluído, vai para uma pasta que representa o arquivo online e pronto, o arquivo já está atualizado em produção e quem fizer o download já pega o arquivo atualizado.

Fantastico, não?

O que aprendemos?

Nessa solução vimos que apenas saber uma tecnologia não é suficiente; é preciso estar envolvido com o negócio do cliente para chegarmos à solução ideal e sabermos se realmente resolve o problema e agrega valor ao dia a dia do nosso cliente. Não resolver um problema apenas por que temos que resolver, mas buscar como solucionar da melhor forma. É  assim que os profissionais na ITS vivem e respiram todos os dias, e sabemos que negócio & TI não estão separados, e sim juntos. Se você for na API do dropbox é tudo abstrato, o que você vai fazer com ela é uma questão sua. E nós chegamos a essa arquitetura devido ao nível de envolvimento que tínhamos com o negócio, senão ia ser mais uma API disponível como qualquer outra.

Agora temos mais desafios de automatizar alguns trabalhos e permitir que a promoção de uma pasta para outra seja rápida e simples.

Não deixe de conhecer o easyJavaDropboxAPI

Abraços. See ya! 

Série Dropbox Lançamento easyJavaDropboxAPI for Java Developer

Olá Pessoal,

É com muito prazer que venho apresentar pra vocês mais um trabalho da minha start-up: a ITS. Estamos trabalhando bastante com o dropbox aqui para soluções corporativas, e até final do ano devemos lançar uma plataforma para comunidade que vai estar usando a tecnologia. Nesse trabalho percebemos que era necessário criar uma API Java para o dropboxAPI. O motivo? Tínhamos muito trabalho sempre que um projeto ia precisar o dropbox API, ai decidi criar uma API  que chamei de easyJavaDropboxAPI. Como sabemos, qualidade de software, produtividade e manutenção é um desafio sempre e aqui acreditamos bastante no aprendizado contínuo para melhorar o que fizemos ontem, hoje e amanhã.  A seguir explico mais sobre a API e mostro um exemplo simples de uma aplicação Java  + easyJavaDropboxAPI.

lets go…

easyJavaDropboxAPI

Tudo começou de uma simples ideia, e enquanto fui dormir com um problema achei a solução durante os sonhos. Pode acreditar, foi verdade isso. Dei inicio aos estudos e achei a solução na api do dropbox. Infelizmente não posso entrar em detalhes do negócio, pois foi para um projeto corporativo que usamos. Outros projetos chegaram e precisamos da API, então certa hora eu disse “pessoal, precisamos criar uma API Java para o dropbox API. Já temos vários projetos usando e vai ser complicado dar manutenção”. Antes de tornar a easyJavaDropboxAPI pública, ela tinha outro nome, easyDropboxAPI. E por que eu deveria usar a easyJavaDropboxAPI e não diretamente API dropbox API?

É dificil responder a pergunta acima, mas vou mostrar os motivos que nos levou aqui na ITS a termos uma API .

 

Problemas

Produtividade

Estamos crescendo com soluções enterprise usando dropbox API e já estávamos entrando no terceiro projeto quando vimos que o custo de manutenção estava começando a aparecer. No inicio não tínhamos noção do quanto a API poderia ajudar em outros projetos e foi preciso usar em um projeto interno, testar por um período não só a funcionalidade, mas outros fatores de negócio. Por isso que não começamos criando uma API, mas a coisa “virou” e agora queremos ganhar tempo, e com a API é muito simples sair usando em meia dúzia de linhas e em poucos minutos você já está conectado ao dropbox.

Manutenção

Agora não é preciso ficar preocupado com a manutenção do código que conecta com a API do dropbox. Como o dropbox team está sempre atualizando e lançando novas features, temos apenas um único local que vai ter essa feature atualizada e os projetos que precisarem faz o update do .jar para a versão mais recente.

Desenvolvimento Ágil

Na interface temos os métodos mais comuns e objetos do dropbox API que é a base do serviço, então um desenvolvedor novo precisa inicialmente entender pontualmente e à medida que ele for evoluindo vai entrando nos detalhes. Por exemplo, se você pretende listar os arquivos que está no diretório /home do seu dropbox o que precisa ser feito?

1. Saber o que é um token e gerar um;

2. Chamar o método listFiles que retorna todos os arquivos do diretório informado

Cada elemento no list é um arquivo do diretório.

Esses três pontos foram o suficiente para termos API e impactou bastante no dia a dia desenvolvimento.

Vamos ver na prática?

Praticando

1. Crie um simple maven project

2. Adicione a dependência no pom.xml

dropboxeasyjavaapipom

 

<dependency>

<groupId>com.its.api</groupId>

<artifactId>easyJavaDropboxAPI</artifactId>

<version>1.0.0</version>

</dependency>

 

3. Adicione o nosso repositório no pom.xml

<repositories>

<repository>

<id>easyJavaDropboxAPI</id>

<url>https://raw.github.com/ITSStartup/easyJavaDropboxAPI/mvn-repo</url>

<snapshots>

<enabled>true</enabled>

<updatePolicy>always</updatePolicy>

</snapshots>

</repository>

</repositories>

 

4. Crie uma classe Java com o método main

 

public class DropboxMain {

public static void main(String[] args) throws DbxException {

String token = "TOKEN HERE";

EasyJavaDropBoxService easyJavaDropBoxService = new EasyJavaDropBoxServiceImpl(path, token);

List<DbxEntry> listFiles = easyJavaDropBoxService.listFiles();

for (DbxEntry file : listFiles) {

System.out.println(file.name);

}

}

}

 

5. Gere o token seguindo as instruções:

http://apps.camilolopes.com.br/dpboxapiweb

 

6. Rode aplicação e verá:

dropboxconsoleasyapi

 

Pronto, os arquivos que tenho na pasta são listados.

Simples, não?

O projeto de exemplo está disponível no repositório da ITS.

E caso queriam saber mais sobre API, visite o repositório:

https://github.com/ITSStartup/easyJavaDropboxAPI

Abracos. See ya!!!