Mostrando postagens com marcador DESENVOLVIMENTO. Mostrar todas as postagens

terça-feira, 10 de janeiro de 2017

[Debug] Comparar/Listar Strings acentuadas usando Collactor

Fala galera que acompanha o blog...   
   
Quando estamos trabalhando com strings, sempre nos deparamos com problemas clássicos, como por exemplo, comparar strings maiúsculas com minúsculas, acentuadas, com codificação diferente e até mesmo na hora de listar essas strings ordenando de forma crescente ou decrescente e por ai em diante.  
   
[Debug] Comparar/Listar Strings acentuadas usando Collactor


Nesse post eu vou estar ensinando uma forma de comparar strings acentuadas utilizando o Collactor. Acredite ou não, no Java existe uma classe que realiza essa comparação ignorando os acentos.   

Vamos utilizar como exemplo o meu nome Luíz Fágner Zordan, mas é claro que a forma original é sem acento algum. Veja essas premissas:   
 
Luíz Fágner Zordan e Luiz Fagner Zordan são as mesmas pessoas, o que difere são os acentos;   
Luiz Fágner Zordan e LUÍZ FÁGNER ZORDAN são as mesmas pessoas, o que difere são os acentos e as letras maiúsculas;   
Luiz Fágner Zordan e Luiz Vagner Zordan não são as mesmas pessoas;   
   
Veja esse código:   
 
class CollatorEmAcao { 

    public static void main(String[] args) { 

        // Compara Strings, ignorando os acentos 

        String st1 = "Luíz Fágner Zordan"; 

        String st2 = "Luiz Fagner Zordan "; 

        String st3 = "LUÍZ FÁGNER ZORDAN"; 

        String st4 = "Luiz Vagner Zordan"; // Perceba que o nome está escrito errado 
  

        Collator collator = Collator.getInstance (new Locale ("pt", "BR")); 

        collator.setStrength(Collator.PRIMARY);     

        if (collator.compare (st1, st2) == 0) { 

            System.out.println ("Os dois Fagner são as mesmas pessoas, o que difere são os acentos"); 

        } 

        if (collator.compare (st1, st3) == 0) { 

            System.out.println ("Os dois Fagner são as mesmas pessoas, o que difere são os acentos e as letras maiúsculas"); 

        } 

        if (collator.compare (st1, st4) != 0) { 

            System.out.println ("Os dois Fagner não são as mesmas pessoas"); 

        } 

} 



Bom, vimos como comparar strings ignorando os acentos, agora vamos ordenar as strings, ignorando os acentos. Para essa segunda parte vejam o seguinte exemplo:   
 
class CollactorEmAcao{ 

    public static void main(String[] args) { 

        // Ordena String, ignorando os acentos. 

        String[] nomes = { 

            "José Aparecido", 

            "João Simões", 

            "Jó Abedenego"   

        };   

        // Sem o uso de "collator" o resultado deve ser: 

       //  [José Aparecido, João Simões, Jó Abedenego] 

       //  que é o contrário da língua portuguesa 

        SortedSet<String> st1 = new TreeSet<String>(); 

        for (String nome : nomes) { 

            st1.add (nome); 

        } 

        System.out.println (st1); 

        // Usando "collator", o resultado deve ser: 

        // [Jó Abedenego, João Simões, José Aparecido] 

        final Collator coll = Collator.getInstance (new Locale ("pt", "BR")); 

  
        SortedSet<String> st2 = new TreeSet<String>(new Comparator<String>() { 

            public int compare (String s1, String s2) { 

                return coll.compare (s1, s2); 

            } 

        }); 

        for (String nome : nomes) { 

            st2.add (nome); 

        } 

        System.out.println (st2); 

    } 

}

Sem o uso do Collactor, não é respeitada as normas corretas de ordenação, por isso a ordenação acaba ficando "errada".

É isso ai pessoal, até a próxima

segunda-feira, 12 de dezembro de 2016

[Debug] Reordenar um elemento dentro do Array com AngularJS

Fala galera que acompanha o blog... 

Esse post mesmo sendo voltado para AngularJS, adaptado pode ser utilizado para várias outras linguagens. 



O problema era o seguinte, ao implementar um chat, tenha em mente o WhatsApp, ao receber uma nova mensagem a sua lista de conversas são reordenadas, com esse contato que te mandou uma nova mensagem ficando no topo da lista de conversas. 

Quando estou trabalhando com AngularJS costumo utilizar a biblioteca Lodash, que facilita bastante o trabalho. 

Bom a solução para o problema mencionado foi o seguinte: 

$scope.setGroup = function(group) {

        moveElementArray($scope.chatList, _.indexOf($scope.chatList, group), 0);

 }; 


function moveElementArray(arrRef, fromIndex, toIndex) {

        var element = arrRef[fromIndex];

        arrRef.splice(fromIndex, 1);

        arrRef.splice(toIndex, 0, element);

 }

Onde: 
  • setGroup() é o método que eu chamo da minha página enviando group como parâmetro; 
  • group é o parâmetro (um Objeto) que representa uma conversa dentro da minha lista de conversas; 
moveElementArray() é uma função que recebe 3 parâmetros: 

  • lista de conversas; 
  • O index do meu objeto atualmente dentro da lista de conversas; 
  • 0 que é a primeira posição de um array. 

Dessa forma eu recupero o meu objeto dentro o array e reposiciono ele na primeira posição. Importante deixar claro que o trecho _.indexOf($scope.chatList, group), é a biblioteca Lodash me auxiliando, se você olhar a documentação vai ver que é possível realizar busca binária adicionando mais um parâmetro nessa função.  

Eu tentei deixar mais genérica possível a função moveElementArray para que eu possa utilizar diversas vezes de qualquer parte do meu código e resolvi compartilhar essa função simples, pois trabalhar com array é bastante comum e vai acabar me servindo de "cola" para outros projetos em que estiver trabalhando rs 

É isso ai pessoal, até a próxima!

sexta-feira, 9 de dezembro de 2016

[Debug] Remover acentos utilizando Normalize

Fala galera que acompanha o blog...

Estava criando uma classe de utilitários, que logo pretendo disponibilizar aqui no blog, e acabei encontrando uma forma muito elegante de remover acentos de uma string utilizando o Normalize.




Se você pesquisar algo como "como remover acentos de uma string", vai perceber que existem diversas formas de faze-lo, usando arrays, mapa de caracteres, usando a biblioteca Apache Commons Lang, replaceAll com regex, indexOf() e várias outras formas. No entanto a classe Normalize, foi a que me chamou mais atenção, veja o código abaixo:

package com.devic.main;
import java.text.Normalizer;
public class Main {

 public static void main(String[] args) {
 String entrada = "çÇáéíóúýÁÉÍÓÚÝàèìòùÀÈÌÒÙãõñäëïöüÿÄËÏÖÜÃÕÑâêîôûÂÊÎÔÛ";
 System.out.println(Normalizer.normalize(entrada, Normalizer.Form.NFKD).replaceAll("\\p{InCombiningDiacriticalMarks}+", ""));
 }
}

Saida:

cCaeiouyAEIOUYaeiouAEIOUaonaeiouyAEIOUAONaeiouAEIOU

Bonito, não?

Esse trecho de código possui duas etapas:

  • Normalizar a nossa string seguindo o tipo de normalização enviado como parâmetro;
  • Realizar o replace de todos os caracteres normalizados para a sua forma normal.
Vamos ver outro código para entender melhor o que está acontecendo:

String entrada = "aáeéiíoóöőuúüű AÁEÉIÍOÓÖŐUÚÜŰ";
for (int i = 0; i < entrada.length(); i++) {
 
  // nos iremos escrever cada caracter separado, para visualizar melhor como ele funciona
  String texto = original.substring(i, i + 1);
 
  // realizando a normalização
  String decomposto = Normalizer.normalize(texto, Form.NFD);
  // removing diacritics
  String removido = decomposto.replaceAll("\\p{InCombiningDiacriticalMarks}+", "");

 System.out.println(texto + " (" + asHex(texto) + ") -> "
 + decomposto + " (" + asHex(decomposto) + ") -> "
 + removido + " (" + asHex(removido) + ")");
}


E a saída, ficará assim:

a (0061     ) -> a (0061     ) -> a (0061     )

á (00e1     ) -> á (0061 0301) -> a (0061     )

e (0065     ) -> e (0065     ) -> e (0065     )

é (00e9     ) -> é (0065 0301) -> e (0065     )

i (0069     ) -> i (0069     ) -> i (0069     )

í (00ed     ) -> í (0069 0301) -> i (0069     )

o (006f     ) -> o (006f     ) -> o (006f     )

ó (00f3     ) -> ó (006f 0301) -> o (006f     )

ö (00f6     ) -> ö (006f 0308) -> o (006f     )

ő (0151     ) -> ő (006f 030b) -> o (006f     )

u (0075     ) -> u (0075     ) -> u (0075     )

ú (00fa     ) -> ú (0075 0301) -> u (0075     )

ü (00fc     ) -> ü (0075 0308) -> u (0075     )

ű (0171     ) -> ű (0075 030b) -> u (0075     )

  (0020     ) ->   (0020     ) ->   (0020     )

A (0041     ) -> A (0041     ) -> A (0041     )

Á (00c1     ) -> Á (0041 0301) -> A (0041     )

E (0045     ) -> E (0045     ) -> E (0045     )

É (00c9     ) -> É (0045 0301) -> E (0045     )

I (0049     ) -> I (0049     ) -> I (0049     )

Í (00cd     ) -> Í (0049 0301) -> I (0049     )

O (004f     ) -> O (004f     ) -> O (004f     )

Ó (00d3     ) -> Ó (004f 0301) -> O (004f     )

Ö (00d6     ) -> Ö (004f 0308) -> O (004f     )

Ő (0150     ) -> Ő (004f 030b) -> O (004f     )

U (0055     ) -> U (0055     ) -> U (0055     )

Ú (00da     ) -> Ú (0055 0301) -> U (0055     )

Ü (00dc     ) -> Ü (0055 0308) -> U (0055     )

Ű (0170     ) -> Ű (0055 030b) -> U (0055     )


É isso ai pessoal, espero que tenham gostado e que seja bastante útil ai no projeto de vocês.

Até a próxima!

sábado, 12 de novembro de 2016

Sobre AngularJS #001

Fala galera que acompanha o blog...

Se você trabalha com desenvolvimento de aplicações web, principalmente com a parte front-end de um sistema, já deve ter pelo menos ouvido falar do "queridinho" AngularJS, ou para os íntimos Angular.

AngularJS é um framework JavaScript open-source que Segue o padrão MVW (model, view e whatever rs), posteriormente foi considerado MVC, MVP, MVVM da engenharia de software, foi contribuído sobre a crença de que a programação declarativa é melhor do que a programação imperativa quando se trata da construção de interfaces com o usuário, enquanto a programação imperativa é excelente para escrita de regras de negócio.


Sobre AngularJS #001

A sua principal característica é com certeza a "Ligação bidirecional de dados" (Two-way data binding). Essa característica reduz a quantidade de códigos escritos para mostrar os dados processados pelo servidor. A variável $scope do Angular detecta mudanças no modelo e modifica o HTML na view por meio de um controller. Da mesma forma, qualquer alteração da view é refletida no model. Vamos perceber essa característica quando começarmos a implementar alguns exemplos.

Ahhh! E é claro, não poderia de deixar de dizer, que o framework é mantido pelo Google rs



Para compreender um pouco sobre a popularidade do framework, basta pesquisar pela palavra "Angular" no YouTube e verificar os mais de 424.000 resultados (aproximadamente) que são apresentados. E não é só isso!


Ao acessar o repositório do Angular no GitHub você se depara com mais de 53 mil estrelas, aproximadamente mil contribuintes e mais de 200 mil repositórios com scripts que utilizam o framework.

Nos próximos posts vou mostrar alguns exemplos básicos de Angular, explicando as diretivas, expressões, filtros, modulos, formulário, validações e várias outras coisas bem legais.

É isso pessoal, até a próxima!

sexta-feira, 23 de setembro de 2016

GO GO! Semana Desenvolvimento Android

Fala galera que acompanha o blog...

"Chegou a Hora de dar um Upgrade de Carreira com Desenvolvimento Android.

O mercado mobile está bombando e muito aquecido mesmo com a famosa crise no Brasil. São mais de 40 milhões de smartphones ativos em nosso pais com usuários sedentos por aplicativos que resolvam seus problemas.

GO GO! Semana Desenvolvimento Android

E sabe para quem isso é bom? Quem ganha as oportunidades no mercado?

Os desenvolvedores Android!

Se quer aprender todos os passos para se tornar um desenvolvedor Android, dar um upgrade na sua carreira e ainda se divertir muito, tenho um convite para você.

Dia 26, próxima segunda-feira começa a Semana do Desenvolvimento Android, onde o programador Fillipe Cordeiro vai ensinar GRATUITAMENTE:
  • Os principais erros que todo mundo comete na hora de estudar desenvolvimento Android ou qualquer outra linguagem, e que, provavelmente, você esteja cometendo também, o que acaba "travando" o seu progresso. 
  • Os conceitos básicos e o caminho que você deve seguir para se tornar um desenvolvedor de aplicativos Android profissional. 
Para garantir uma das últimas vagas e participar desse excelente evento, basta fazer rapidamente o seu cadastro aqui."

É isso ai pessoal, até a próxima.

quinta-feira, 1 de setembro de 2016

[ADVPL] Desenvolvendo classes

Fala galera!

Uma das coisa mais interessantes de se aprender durante o desenvolvimento de algumas rotinas em ADVPL, é o uso de classes. Confesso que para mim isso é um pouco recente, mas estou aplicando sempre que possível em meus fontes.




Com o uso de classes, você tem a possibilidade de reduzir as linhas código do seu fonte, evitar repetição de funções e centralizar uma atividade específica em um único arquivo.
Para ficar melhor exemplificado, vou passar à vocês uma forma que utilizei para simplificar/facilitar o processo de envio de emails (worflow) do Protheus. Anteriormente em nossa base havia um fonte onde possuía uma função de usuário que era chamada sempre que fosse necessário enviar os e-mails, ou seja,  em meio ao meu código fonte - caso eu precisasse enviar e-mail - chamaria a função desta forma:
user function envioMail(cMsg, cDe, cPara, cAssunto)

local cCc := ""
local cBcc := ""
local cAnexo := ""
local cTitulo := ""

cEnvMail := u_EnvMail(  cDe,;      //cDe - origem
   cPara,;    //cPara
   cCc,;    //cCc
   cBcc,;     //cBCC
   cAssunto,; //cTitulo
   cAssunto,; //cAssunto
   cAnexo,;   //cAnexo
   cMsg)    //cMsg

return

A função envioMail() é do fonte que estou desenvolvendo e para enviar o e-mail, preciso "chamar" a outra função (outro fonte/arquivo) chamado u_EnvMail() definindo todos os parâmetros.
Tudo bem! Desta forma é funcional, mas nosso objetivo é tornar o acesso a atividade de envio de e-mail através de uma classe, onde poderíamos - futuramente - trabalhar com objetos e configurar outras funções para nossa classe.

Vamos aos códigos!

Primeiramente vamos adicionar um novo arquivo ao projeto e salvá-lo com o nome ClassMail e adicionaremos o código abaixo:

class ClassMail

      //dados de conexão com o server
      data cServer    //Nome do servidor de envio de e-mail
      data cEmail     //Conta a ser utilizada no envio de e-mail
      data cEmailA    //Usuário para autenticação no servidor de e-mail
      data cPass      //Senha para autenticação no servidor de e-mail
      data lAuth      //Verifica se servidor necessita de autenticação
      data lResulConn //Flag de conexão com o servidor
      data lResulSend //Flag de sucesso de envio de e-mail
      data cError     //Mensagem de erro

      //variáveis para envio do email
      data cDe      //E-mail de origem
      data cPara    //E-mail de destino
      data cCc      //E-mail de cópia
      data cBcc     //E-mail de cópia oculta
      data cTitulo  //Título do e-mail
      data cAssunto //Assunto do e-mail
      data cAnexo   //Arquivo que será anexado
      data cMsg     //Mensagem/Conteúdo do e-mail

      //metodo construtor da classe com as variáveis que são enviadas por parâmetro
      method new(cDe, cPara, cCc, cBcc, cTitulo, cAssunto, cAnexo, cMsg) CONSTRUCTOR

      //método de validação dos dados recebidos
      method valDados()

      //método de validação de conexão com o servidor de envio de e-mail
      method valConn()

      //método responsável para efetuar o envio do e-mail
      method sendMail()

endClass
Nesse primeiro ponto, temos a definição das variáveis e métodos de nossa classe. Temos as variáveis responsáveis para efetuar, autorizar e obter o retorno de conexão com o servidor de e-mails e as variáveis que receberemos por parâmetro através do método construtor da nossa classe. depois temos os métodos da classe que utilizaremos durante a execução como validação de dados, conexão e o envio de e-mail.

Em nosso método construtor, vamos receber os dados e atribuir as variáveis da nossa classe. Observe que, quando for referenciar uma variável da classe deve-se utilizar o '::' na frente dela, ou seja, seria algo como ::cEmail. É importante também adicionar ao final do método o nome da classe.

Os métodos podem e devem obter um retorno, somente o tipo do conteúdo/variável que será retornado dependendo da sua aplicação. Veja que em nosso método construtor, não há necessidade retorno, então inserimos a palavra reservada self.

method new(cDe, cPara, cCc, cBcc, cTitulo, cAssunto, cAnexo, cMsg) class ClassMail

 ::cDe      := cDe
 ::cPara    := cPara
 ::cCc      := cCc
 ::cBcc     := cBcc
 ::cTitulo  := cTitulo
 ::cAssunto := cAssunto
 ::cAnexo   := cAnexo
 ::cMsg     := cMsg

return self

Agora vamos aplicar a validação dos dados principais de nossa classe. através do método valDados() Não é possível enviar um e-mail sem um e-mail de origem, destino e assunto - ou qualquer outro campo que você desejar.

method valDados() class ClassMail

local lRet := .T.

if empty(::cDe) .or. empty(::cPara) .or. empty(::cAssunto)
 msgAlert("Os campos 'De','Para' ou 'Assunto' devem ser preenchidos corretamente!","ERRO")
 lRet := .F.
endIf

return lRet

Precisamos agora do método responsável por efetuar a conexão com o servidor de e-mails e, para isso, vamos definir outro método nomeado valConn().

method valConn() class ClassMail

local lRet := .T.

::cServer := allTrim(getMv("MV_RELSERV")) //Nome do servidor de envio de e-mail
::cEmail  := allTrim(getMv("MV_RELACNT")) //Conta a ser utilizada no envio de e-mail
::cEmailA := allTrim(getMv("MV_RELAUSR")) //Usuário para autenticação no servidor de e-mail
::cPass   := allTrim(getMv("MV_RELAPSW")) //Senha para autenticação no servidor de e-mail
::lAuth   := getMv("MV_RELAUTH") //Verifica se servidor necessita de autenticação

if (empty(::cServer) .or. empty(::cEmail) .or. empty(::cEmailA) .or. empty(::cPass)) .and. ::valDados()
 msgAlert("Não foi possível obter os dados dos parâmetros de envio de e-mail do Protheus!","Erro envio de e-mail")
 lRet := .F.
else
 //Efetua a conexão com o servidor
 CONNECT SMTP SERVER ::cServer ACCOUNT ::cEmail PASSWORD ::cPass RESULT ::lResulConn

 //se necessita a autenticação do servidor
 if ::lAuth
  lOk := MailAuth(::cEmailA, ::cPass)
  if !lOk
   lOk := QAGetMail()
  endIf
 endIf

 if !::lResulConn
  get MAIL ERROR ::cError
  msgAlert("Falha na conexão: " + ::cError,"Erro - Problema de conexão")
  lRet := .F.
 endIf
endIf

return lRet

Depois desses métodos desenvolvidos precisamos fazer o envio do e-mail. Então o método sendMail() fará isso para nós.

method sendMail() class ClassMail

//se as validações (conexão e dados) estiverem ok. Efetua o envio do e-mail
if ::valConn() .and. ::valDados()

 SEND MAIL from ::cDe;
  to         ::cPara;
  CC         ::cCc;
  BCC        ::cBcc;
  SUBJECT    ::cAssunto;
  BODY       ::cMsg;
  ATTACHMENT allTrim(::cAnexo);
  RESULT     ::lResulSend

 get MAIL ERROR ::cError

 if !::lResulSend
  msgAlert("Falha no envio do e-mail: " + ::cError,"Erro - E-mail não enviado")
 endif

 DISCONNECT SMTP SERVER
else
 msgInfo("Email não enviado!")
endIf

return self

Bom, com o intuito de evitar tentativa de conexão desnecessária, condicionaremos essa ação ao retorno dos métodos valConn() e valDados() - Note que, assim como as variáveis, os métodos devem ser tratados dentro da classe com '::'.

Assim que testarmos o nosso fonte e compilarmos, podemos substituir a chamada na função original onde precisamo enviar o email. Então ele ficará modificado da seguinte forma:

user function envioMail(cMsg, cDe, cPara, cAssunto)

local cCc := ""
local cBcc := ""
local cAnexo := ""
local cTitulo := ""

objMail := ClassMail():new(cDe, cPara, cCc, cBcc, cTitulo, cAssunto, cAnexo, cMsg)
objMail:sendMail()

return

Em nossa função de usuário teremos um objeto - objMail - que será uma instancia da nossa classe ClassMail() e passará em seu método construtor as informações para o envio do e-mail. Após isso, basta chamar o método sendMail(). 

Com o desenvolvimento de classes podemos incrementar nossas possibilidades de uso de funções e aplicações específicas do sistema, tornando mais fácil o desenvolvimento e manutenção do fonte. Claro que aqui foi dado um exemplo simples, mas é possível adicionar mais funcionalidades de acordo com o que precisar.

Até mais!

;)

sábado, 20 de agosto de 2016

Campanha anti IF

Fala galera que acompanha o blog...

O titulo desse post é um pouco estranho e até meio assustador, mas é exatamente isso que a campanha sugere "Evitar o uso do IF". Mas é claro que não é elimina-lo por completo dos nossos códigos, mas fazer um uso consciente visando a qualidade e arquitetura do nosso projeto.

Campanha anti IF


Confesso que achei estranho em um primeiro momento, mas a curiosidade e o interesse em como fazer um uso "correto" da estrutura da condicional if prevaleceu.
A campanha conta com poucos participantes, não é muito conhecida, mas participaria com certeza de eventos e palestras sobre o assunto.

Acessando o site na aba "Experiences" é possível encontrar o seguinte trecho (tradução livre):
Neste site você vai encontrar posts e vídeos que mostram como lidar com IFs ruins e transformar um design ruim em uma oportunidade para crescer o seu software de uma forma saudável.

Para saber mais sobre essa campanha e quem sabe até aderir, acesse o site antiifcampaign.

Enviei um email pedindo mais informações sobre onde consigo material para estudar sobre o assunto, assim que tiver um retorno vou atualizando em novos posts.

É isso pessoal, até a próxima!

domingo, 24 de julho de 2016

Variáveis de Ambiente

Fala galera que acompanha o blog...


Um post rápido, direto e com imagens detalhadas de cada passo sobre como gerenciar (CRUD) uma variável de ambiente.



Variáveis de Ambiente

É um assunto antigo e muito falado em vários posts pela internet, por ser muito importante na hora de realizar a configuração do ambiente de desenvolvimento. Mas vamos deixar aqui a nossa contribuição para o pessoal que está iniciando como desenvolvedor e precisa configurar seu ambiente.


  1. Clique no botão Iniciar;
  2. Clique com o botão direito do mouse na opção "Computador" e selecione propriedades;
Outra opção:
  1. Clique no botão Iniciar;
  2. Clique em Painel de Controle;
  3. Clique em Sistema.

Clique em "Configuração avançadas do sistema".



Clique em "Variáveis de Ambiente..."




Nessa tela é que criamos ou uma variável de sistema ou uma variável de usuário, a diferença de um tipo para outro já fica implícito no nome.
Nesse tutorial estarei criando uma variável de sistema. Mas os mesmos passos são seguidos caso deseje criar a variável de usuário.

Perceba que a lista de variáveis é definida por chave e valor, onde a chave é o nome da sua variavel e o valor o caminho onde se encontra o seu serviço.


Clique no nome da variável de usuário ou de sistema que você deseja alterar ou excluir. 

  • Clique em Novo para adicionar um novo valor e nome de variável.
  • Clique em Editar para alterar o valor e o nome da variável atual.
  • Clique em Excluir para remover um valor e nome de variável.

Para esse exemplo vamos criar a variavel de ambiente JAVA_HOME.


Definimos o nome da variavel como JAVA_HOME e o valor da variavel é o caminho onde foi instalado a JDK. Clique em "OK" para confirmar a criação da variavel e "OK" novamente na tela de variáveis de ambiente para atualizar todas as variáveis configuradas.

Um teste simples, abra o prompt de comando e escreva echo %JAVA_HOME".
Ao informar a chave o console de prompt nos apresenta o valor configurado: C:\Program Files\Java\jdk1.7.0_79

Agora precisamo adicionar nossa variavel dentro da variavel PATH. Siga os passos:
  1. Localize a variavel PATH, selecione e clique em editar;
  2. Em valor da variavel, vá até o final da string e adicione um ponto e virgula ";", caso não tenha, e adicione a sua variavel %JAVA_HOME%.
Observe que após a variavel eu adicionei /bin isso foi necessário pois o conteúdo da minha JAVA_HOME termina com a versão da JDK, mas o executável do JAVA fica dentro de bin.
Resultado:

Clique em "OK" para confirmar a edição da variavel e "OK" novamente na tela de variáveis de ambiente para atualizar todas as variáveis configuradas.

Vamos realizar o mesmo teste anteriormente no prompt de comando, mas dessa vez passando o comando echo %PATH" e o resultado será uma string com todas as suas variáveis definida e ao final o valor da sua variavel JAVA_HOME.

Pessoal é isso, espero que tenha ajudado, que tenha ficado claro, qualquer dúvida mande-nos uma mensagem.

Até a próxima!