sexta-feira, 14 de novembro de 2014

Habilitar CORS para acessar serviços REST

Uma vez que implementamos e disponibilizamos o serviço Restfull, precisamos definir qual domínio pode ter acesso a este serviço. Os navegadores possuem uma segurança que não permitem arquivos javascript acessarem serviços externos via http, os chamados CORS (Cross-Origin Resource Sharing). 
Se tentarmos acessar um serviço sem habilitá-lo, nos deparamos com esta mensagem:



Precisamos habilitar o CORS em nosso servidor, resumindo precisamos seguir 2 passos:
  1. Escrever um header para retorno da resposta http em um filtro.
  2. Mapear na aplicação (web.xml) este filtro.
(obs: utilizando java servlet)

1) O filtro com habilitando o CORS.
public class SimpleCORSFilter implements Filter{
 @Override
 public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
  HttpServletResponse response = (HttpServletResponse) res;
  response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Headers", "x-requested-with");
        chain.doFilter(req, res);
 }

 @Override
 public void destroy() {
 }

 @Override
 public void init(FilterConfig arg0) throws ServletException {
 }
}

Explicando...
response.setHeader("Access-Control-Allow-Origin", "*");
Neste trecho definimos permissão para qualquer (*) domínio acessar nosso serviço!

2) Mapendo filtro na aplicação

 simpleCORSFilter
  br.com.adriano.filter.SimpleCORSFilter 



     simpleCORSFilter
     /*

Com apenas isso, seu serviço está disponível para ser utilizado!

quarta-feira, 12 de novembro de 2014

REST + Jersey + JSON

Hoje vamos criar um projeto com API Rest que retorne uma lista de objetos como JSON. Uma das principais dificuldades que encontrei ao criar um projeto sem o Maven, foi encontrar os jars para o retorno do json.
Existem diversos posts com exemplos de utilização de Rest na internet bem simples, porém apenas com os jars recomendado não consegui retornar via json, apenas xml. O grande segredo está nos jars jackson. Então vamos lá...

Crie um Dynamic Web Project no Eclipse:
Minha estrutura ficou assim:


Os jars necessários para aplicação funcionar estão aí. No meu caso, utilizei o servidor Weblogic, mas poderia ser o Tomcat, por exemplo.

web.xml 
  LaboratorioRest
  
  
   RestController
   com.sun.jersey.spi.container.servlet.ServletContainer
   
    com.sun.jersey.config.property.packages
    br.com.adriano.rest
   
   
  com.sun.jersey.api.json.POJOMappingFeature
  true
 
  
  
  
   RestController
   /*
  
  

Entendendo...

Definimos um nome para servlet para garantir acesso a API Rest.
RestController
com.sun.jersey.spi.container.servlet.ServletContainer
Definimos um parâmetro para dizer qual package vai conter os serviços Rest.

    com.sun.jersey.config.property.packages
    br.com.adriano.rest

Outro parâmetro necessário para o Jersey converter o objeto em JSON.

 com.sun.jersey.api.json.POJOMappingFeature
 true

Usuario.java
package br.com.adriano.model;
import javax.xml.bind.annotation.*;
public class Usuario {
 
 private String login;
 private String senha;
 public String getLogin() {
  return login;
 }
 public void setLogin(String login) {
  this.login = login;
 }
 public String getSenha() {
  return senha;
 }
 public void setSenha(String senha) {
  this.senha = senha;
 }
 
 @Override
 public String toString() {
  return super.toString();
 }
}

Caso queira retornar XML, você deve anotar @XmlRootElement na classe Usuario. Para Json não é necessário.

UsuarioResource.java
package br.com.adriano.rest;
import java.util.*;
import javax.ws.rs.*;
import javax.ws.rs.core.*;
import br.com.adriano.model.*;
@Path("/usuarios")
public class UsuarioResouce {
 static private Map usuarioMap;
 static {
  usuarioMap = new HashMap();
  Usuario usuario1 = new Usuario();
  usuario1.setLogin("admin");
  usuario1.setSenha("passAdmin");
  usuarioMap.put(1, usuario1);
  Usuario usuario2 = new Usuario();
  usuario2.setLogin("adriano");
  usuario2.setSenha("adr123");
  usuarioMap.put(2, usuario2);
 }
 @GET
 @Path("/json")
 @Produces(MediaType.APPLICATION_JSON)
 public List getUsuarios() {
  return new ArrayList(usuarioMap.values());
 }
}
Entendendo...
@Path é o caminho que será acessado pela url para chegar até nossa classe UsuarioResource.
@Path("/usuarios")
public class UsuarioResouce 

Criei uma massa de dados como teste apenas para emular dados vindo do banco. 
static private Map usuarioMap;
 static {
  usuarioMap = new HashMap();
  Usuario usuario1 = new Usuario();
  usuario1.setLogin("admin");
  usuario1.setSenha("passAdmin");
  usuarioMap.put(1, usuario1);
  Usuario usuario2 = new Usuario();
  usuario2.setLogin("adriano");
  usuario2.setSenha("adr123");
  usuarioMap.put(2, usuario2);
 }

@Produces - Definimos o tipo de retorno de dados que queremos, no caso, JSON. (Caso queria XML utilize ("text/xml").        
 @GET
 @Path("/json")
 @Produces(MediaType.APPLICATION_JSON)
 public List getUsuarios() {
  return new ArrayList(usuarioMap.values());
 }

A partir daí, podemos subir a aplicação. Abra o browser e digite o caminho da url do seu projeto. No meu caso foi http://localhost:7001/LaboratorioRest/usuarios/json. Deve aparecer a lista do objeto Usuario em JSON. 
[{"login":"admin","senha":"passAdmin"},{"login":"adriano","senha":"adr123"}]



Bom, é isso! Sem os jars 'jackson' a página não retornava o json. Espero ter ajudado.

Código disponível em: https://github.com/adrianonegrao/angular-js pasta lab-rest.

[]s

segunda-feira, 14 de julho de 2014

Motivação: Identifique as necessidades da sua equipe.

“Você é um líder ou você está líder?”

       Uma simples pergunta lhe faz refletir o verdadeiro significado da palavra liderançaSeja um líder e não esteja como um líder! Estar como líder é um cargo, ser um líder é um mérito reconhecido por seus colaboradores com esforço e dedicação na vontade de chegar a um objetivo em conjunto com sua equipe. 
  •  Trate seus funcionários como você gostaria de ser tratado.
  •  O processo ou o sistema, e não o empregado, é responsável por 90% dos problemas. 
  • As pessoas devem perceber que é de seu próprio interesse oferecer sugestões (e não dar soluções prontas). 
  •  Crie uma cultura que faça com que as pessoas sintam-se parte de uma equipe. 
  •  O reconhecimento não monetário poderá apoiar mais diretamente o trabalho em equipe.

         Um bom líder deve saber motivar seus funcionários. Liderar é servir, é entender a necessidade de cada indivíduo e servi-la. Ponha na cabeça a imagem de um garçom... sirva!!
         Porém não basta simplesmente servir todos de forma igualitária, pois cada indivíduo possui necessidades distintas a serem supridas. Você pode motivar um funcionário que está com auto estima e se sentindo realizado profissionalmente dando um Rolex (se você for muito generoso), mas da mesma forma, tal estímulo não serviria para alguém que necessite de comida. Sendo assim, saiba interpretar os sinais, as necessidades de cada um para poder lhes servir com sabedoria.
Abraham Maslow foi um psicólogo americano que, pensando assim, montou uma hierarquia baseada em tais necessidades. A pirâmide ficou conhecida como Hierarquia de necessidades de Maslow.

A idéia de Maslow é que todo indivíduo pode estar representado em algum nível da pirâmide. A base da pirâmide, o nível mais baixo da necessidade de um indivíduo é representado por respiração, comida, água, sexo, excreção... etc. Um indivíduo sem condições de respirar no ambiente, pode se motivar pra realizar alguma coisa?! É bem assim a idéia de Maslow. E se você reparou que ‘sexo’ é representado na base da pirâmide, sim, fique feliz! Apresente esta pirâmide para sua esposa e diga que enxaquecas não são mais desculpas! Não sou eu quem está falando, é Maslow (rs).
Se um indivíduo está suprido de todas estas necessidades básicas, ele entra no próximo nível da pirâmide, onde as necessidades e as formas de motivação são diferentes. Seguindo esta ideologia, somente quando uma pessoa está totalmente realizada, pode subir para o próximo nível. Procure ter um carinho, observar de perto seus funcionários para saber em qual nível hierárquico o mesmo se encontra para então, servi-lo, ou seja, ajuda-lo de alguma forma a alcançar o próximo nível.
            Maslow identificou que o topo da pirâmide é a realização pessoal. Este indivíduo possui todas as necessidades abaixo e torna difícil achar meios de servi-lo, pois já conquistaram tudo que poderiam. Pessoas que estão neste nível são pessoas bem sucedidas, buscam formas de se auto motivarem para se manterem realizadas e sentir-se bem, seja ajudando ao próximo, ajudando instituições de caridade, etc.
            Então se você hoje está como um líder, aprenda que liderança não é simplesmente mandar e aguardar o resultado. Faça parte da equipe, ande junto, lado a lado com seus funcionários.

Um indivíduo motivado é um indivíduo realizado que agregará valor tanto a sua vida pessoal quanto no âmbito profissional. 

           



sábado, 5 de julho de 2014

Técnica Pomodoro


O que é?
     É uma técnica que consiste em melhorar/medir sua produtividade pessoal. 

Como funciona?
  1. Em um papel, escreva qual atividade vai fazer. Ex. Ler um livro, estudar para química, codificar um método java, arrumar a casa, etc...
  2. Ponha um cronômetro para alarmar em 25 minutos.
  3. Durante este período NÃO perca o foco na sua atividade. Não se deixe interromper neste momento. Foco no trabalho!
    • Exemplo de interrupção:
      • Interrupção Interna: Ver o facebook, olhar o Whatsapp, checar email, etc.
      • Interrupção Externa: Atender o telefone, conversar com o amigo do lado, etc.
  4. Após os 25 minutos você finalizou 1 pomodoro. 
  5. Pare imediatamente sua tarefa por 5 minutos! Descanse, se distraia. Vai beber água, olhar o facebook, retornar aquela ligação, etc. Neste momento é importante não fazer nada relativo a sua tarefa. 
  6. Anote no papel ao lado da sua tarefa, uma bolinha identificando que 1 pomodoro foi realizado.
  7. Após os 5 minutos de descanso, volte a sua atividade iniciando mais um pomodoro.
  8. Repita este ciclo até completar 4 pomodoros.
  9. No quarto pomodoro, você pode tirar 15 minutos de descanso.
  10. No fim, você tem anotado ao lado de cada tarefa quantos pomodoros foram gastos para sua realização, bem como quantas vezes foi interrompido.

Quem pode utilizar?
     Todos podem se beneficiar desta técnica, sejam aqueles que queiram medir seu desempenho em determinada tarefa ou mesmo os que tem habito de procrastinar.
     Venho utilizando esta técnica a um tempo. No começo utilizei com objetivo de não me distrair durante o desenvolvendo de sistemas no trabalho. Depois passei a utilizar na minha vida pessoal para diversas finalidades, que iam desde medir quantas páginas de um livro conseguia ler, até arrumar a casa.
     Uma dica interessante é anotar ao lado de sua tarefa, um tracinho que representa as interrupções sempre que houver durante o pomodoro. Você vai se espantar com a quantidade de distrações que temos em tão pouco tempo!
     A técnica do pomodoro defende a teoria que qualquer coisa, por mais importante que seja, pode esperar o período de 25 minutos. Ou seja, mesmo que o telefone toque, podemos retornar para a pessoa em 25 minutos. Mesmo que seu colega de trabalho venha conversar com você, explique que o atenderá em instantes, espere o pomodoro terminar. 
     Agindo assim, você garante que seu trabalho teve foco 100% e a partir daí, pode medir sua produtividade na tarefa. 
  • Quantos pomodoros gastei pra ler este livro? 
  • Em 1 pomodoro consegui ler 13 páginas da apostila,  no segundo pomodoro li 18 páginas.
  • Tive 7 interrupções internas durante o pomodoro. Preciso melhorar meu foco na tarefa...
  • Etc, etc, etc... 
Abaixo um vídeo explicativo que resume a técnica. Faça um bom proveito.
Obs: Foram gastos 2 pomodoros para criar este post. :)


terça-feira, 24 de agosto de 2010

Enviando Objetos via Socket

Antes de tudo, para enviar Objetos via socket para um Client/Servidor, precisamos SERIALIZAR o objeto a ser enviado. Conseguimos enviar uma String (que é um objeto) porque ela implementa Serializable em sua classe.
Se tiver um objeto próprio, implemente Serializable. Agora se tiver uma classe específica que baixou de algum lugar, como por exemplo org.jdom.Document ( jdom são classes para manipular  xml´s), podemos criar uma classe qualquer implementando Serializable somente para receber esse objeto.
Por exemplo:
import org.jdom.Document;

public class SerializeiDocument implements Serializable{

private static final long serialVersionUID = 1L;
private Document doc;

public Document getDoc() {
    return doc;
}

public void setDoc( Document doc ){
   this.doc = doc; 
}

}
Fazendo isso você já possui uma classe serializada que guarda uma instância do objeto que deseja enviar.

SerializeiDocument  doc = ( SerializeiDocument ) objInputStream.readObject() ;


A classe criada deve conter a mesma estrutura de package tanto no servidor, como no cliente.

Por fim, vamos enviar o objeto de um Cliente para um Servidor...

Classe jars.client.Cliente
import util.SerializeiDocument;
//outros imports...

public class Cliente {

Socket client = null;

ObjectOutputStream oos = null;
SerializeiDocument serialDoc;

public Client(){
    try{
    client = new Socket ( HOST, PORTA );
    oos = new ObjectOutputStream( client.getOutputStream() );
    //Supondo que serialDoc já esteja setado...
    oos.writeObject( serialDoc );
    oos.flush();
    }catch( Exception e ){ }
    finally{ 
        oos.close(); 
        client.close();
    }
}
Classe jars.server.Servidor
import utils.SerializeiDocument;
//outros imports...

public class Servidor {

     ServerSocket server;
     Socket client;

public void go(){
  try{
    server = new SocketServer( PORTA );
    client = server.accept();
    ObjectInputStream ois = new ObjectInputStream( client.getInputStream() );
    SerializeiDocumet sdoc = (SerializeiDocument) ois.readObject();
    //Pronto... sdoc está pronto para ser usado no servidor...
    }catch( Exception e ){}
    finally{ 
      ois.close();
      client.close();
   }
 }
}

terça-feira, 10 de agosto de 2010

Listar e matar processos de Java

Para listarmos os processos que estão executando em Java pelo nome do processo, usamos o comando JPS. Experimente no console digitar 'jps', exibirá a lista dos processos em java com o número do processo (PID) e o nome da Classe.

Abaixo crio uma classe que listará os processos ativos e pegaremos um determinado processo para finaliza-lo.

public void mataProcesso(){

try{
   //Executa comando que lista todos os processos ativos de java
   Process p = Runtime.getRuntime().exec("jps");

   //Ler lista de processos
   InputStream is = p.getInputStream();
   InputStreamReader readerInput = new InputStreamReader( is ) ;
   BufferedReader reader = new BufferedReader( readerInput ); 

   String linha = "";
   //Enquanto linha não for nula, exibe linha
   while ( ( linha = reader.readLine() ) != null ){

      //Se existir o processo abaixo, divide a String em 2, PID e NomeProcesso.
      //nomeDoProcesso é o nome do processo que  mataremos. 
      if ( linha.contains("nomeDoProcesso")){

      String[] getPID = linha.split(" ");
 
      System.out.println("PID: "+ getPID[0]);
      System.out.println("Process name: "+ getPID[1]);

      //Mata Processo pelo pid
      Runtime.getRuntime().exec("taskkill /f /pid "+getPID[0] );
      }
   }
}catch(Exception e){
   e.printStackTrace();
}

Um exemplo de saída dos processos (Meus processos ativos que estavam rodando no momento da execução) :

652 Jps
2164 jMentor
2444 Bootstrap
3428