terça-feira, 12 de abril de 2016

Diferença entre String, StringBuilder e StringBuffer em Java #2

Esse é o segundo post sobre "Diferença entre String, StringBuilder e StringBuffer em Java", caso tenha perdido o primeiro post clique aqui para acompanhar o assunto.


Anteriormente aviamos avaliado o desempenho quando concatenamos vários caracteres "f", utilizando String. Podemos concluir que utilizar String para concatenar strings pode ser muito prejudicial para o desempenho do seu código.

Hoje vamos analisar a diferença do tempo de processamento entre String e StringBuilder.
Para facilitar, vamos utilizar o mesmo código anterior, realizando pequenas adaptações, para vermos de fato a velocidade de execução do StringBuilder
  • Comparando performance de String e String Builder
public class ConcatenaString {

    public static void main(String[] args) { 
              
        // Trecho de código para String
        String strFinal = "";
        long tStart = System.currentTimeMillis(); 
        
        // Vamos concatenar 100000 vezes o caractere 'f', 
        // então relembremos que cada vez que passarmos no laço 
        // a JVM irá criar um novo objeto em memória.
        for (int i = 0; i < 100000; i++) {
            strFinal += "f";
        }

        long tEnd = System.currentTimeMillis();
        long tResult = tEnd - tStart;
        System.out.println("Tempo de execução com String = " + tResult + " ms"); 
        
        // Trecho de código para StringBuilder
        StringBuilder strBuilder = new StringBuilder();
        tStart = System.currentTimeMillis();
        for (int i = 0; i < 100000; i++) {
            strBuilder.append("f");
        }

        tEnd = System.currentTimeMillis();
        tResult = tEnd - tStart;
        System.out.println("Tempo de execução com StringBuilder = " + tResult + " ms");
    }
}
Tempo de execução com String = 14627 ms
Tempo de execução com StringBuilder = 0 ms

Na minha máquina ao executar o código acima, a saída foi de 14627ms para String com o operador "+" e 0ms para o StringBuilder. Foram utilizados apenas 100mil caracteres, mas vamos imaginar se aumentássemos em 10x esse valor... Seria 1milhão de caracteres.

Altere o valor do seu código e verifique a o tempo de processamento.

Perceba que para não tornar o teste tendencioso, coloquei o tInicio e o tFim no início e no fim do laço "for", dessa forma desconsideramos qualquer outro código que venha antes ou depois, por exemplo as atribuições e escritas no console, assim avaliamos puramente a concatenação de ambos.

Sem dúvidas a performance do StringBuilder comparado a String comum é muito melhor quando precisamos concatenar valores.

O que acontece na verdade é que StringBuilder é mútavel, ou seja, a cada "append(valor)" que fizemos no laço, concatenamos de fato um novo valor a String já existente, sem a necessidade da criação de um novo objeto em memória. Mas e qual a diferença entre StringBuilder e StringBuffer? A resposta fica para o próximo post. Até a próxima.

Bloco de Código em Advpl




Fala galera!

Para quem atua na área de desenvolvimento Advpl com certeza já se deparou com o famoso Bloco de código. Afinal, o que é isso e para que serve?

Conceito

Bloco de código são pequenas funções implementadas entre chaves “{}” e separadas por “,” que permite a execução sequencial delas. Assemelha-se a uma matriz de comandos. Por exemplo:


x := {|| a := 2, b := 2, a +b}

Aqui é um exemplo muito simples. Bloco de código executa um comando por vez e o resultado final será sempre o último comando da sequência, neste caso, a soma de a e b. E esse valor será atribuído à variável x.


Parâmetros

Em bloco de códigos é possível utilizar parâmetros para validação e manipulação de dados. Para isso, basta adicionar a variável que possui o valor armazenado entre os pipes ||.  Desta forma, será possível enviar qualquer tipo de variável para o bloco de código. Vamos ao exemplo:



x :=  {|y| iif( y = 0, .T. ,  .F. ) }

Nesse exemplo enviamos a variável y por parâmetro e seu valor é utilizado para manipular o resultado que será atribuído ao x. Se y for igual a 0 retornará verdadeiro (.T.) se não, retornará falso (.F.).

Além disso é possível enviar mais de um parâmetro, basta adicionar as variáveis separadas por vírgula e trabalhar com seus valores normalmente.
Bom pessoal, essa foi uma pequena ideia do que é e como utilizar o bloco de código. Claro que é possível fazer muito mais que apenas somas e condições if, mas de acordo com a sua evolução na linguagem automaticamente vai desenvolvendo novos métodos de uso.

Até a próxima!

segunda-feira, 11 de abril de 2016

Integração Advpl x Excel #1

Fala galera!

Vou iniciar um post sobre como fazer uma integração Advpl e Excel, onde iremos exportar uma planilha com dados de clientes de forma simples.


Integração Advpl x Excel


Bom, antes de começar, vamos definir quais campos queremos que apareça em nossa planilha. 
Vou definir os seguintes campos:

Código Cliente, Nome, Endereço, Bairro, Cidade e Estado.

Primeiro, vamos implementar a função principal denominada expExcel (esse foi o nome que eu escolhi, você pode optar por qualquer outro nome de sua preferência).
#include "protheus.ch"                                                       
#include "rwmake.ch"
//_________________________________________________________________________________
//¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦
//¦¦+---------------------------------------------------------------------------+¦¦
//¦¦¦Programa  ¦ EXPEXCEL  ¦ Autor ¦ Renan Ramos              ¦ Data ¦ 21.01.16 ¦¦¦
//¦¦¦----------+----------------------------------------------------------------¦¦¦
//¦¦¦Descriçäo ¦ Programa que exporta clientes para planilha do excel.          ¦¦¦
//¦¦+---------------------------------------------------------------------------+¦¦
//¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦
//¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯

user function expExcel

private oReport

//exibe um diálogo onde a execução de um processo pode ser monitorada através da régua de progressão.                               
processa({|| oReport := ReportDef(), oReport:PrintDialog()},"Imprmindo dados...")

return  

Bom, nesta função, além de executar o método processa(<função>,<mensagem>) , também declaramos o objeto oReport que será utilizado para configurarmos os métodos e atributos do relatório.

O método processa(<função>,<mensagem>) é utilizado para apresentar uma mensagem ao usuário enquanto algumas funções estão em execução. Em seu primeiro parâmetro é onde será definida qual a função será executada. Existe a opção de somente chamar uma outra função qualquer ou , como nosso caso, utilizar de blocos de códigos. No segundo parâmetro é apresentada a mensagem que o usuário irá visualizar durante a execução em background da função definida no primeiro parâmetro e nossa mensagem será "Imprimindo dados...". 

Bloco de código: esta facilidade é amplamente utilizada no universo ADVPL. Bloco de código não é nada diferente que o seu próprio nome diz, um bloco de código. Para melhor entendimento, vejamos nosso caso:

{|| oReport := ReportDef(), oReport:PrintDialog()}

Bloco de código são códigos diferentes separados por "," (vírgula) e são executados sequencialmente, ou seja, no nosso bloco de código, primeiro será executada o método reportDef() e posteriormente o método do objeto oReport, printDialog().

PrintDialog é a função responsável por abrir a tela de configuração de impressão do sistema.

Veja mais sobre Bloco de código neste post.

Então, esta função principal (expExcel()) irá executar o método processa() que por sua vez executará o bloco de código definido em seu primeiro parâmetro.

No próximo post vou passar o método reportDef() e prosseguir com a explicação de cada elemento do relatório.

Até mais!

Debug #2 - Carregar imagens no relatório

E ai pessoal...

Estava verificando um problema no sistema, onde ao gerar o relatório no ambiente de produção a imagem não era renderizada, o que não acontecia no ambiente de desenvolvimento.

Debug #2


Estava sendo utilizado o IReport e o problema foi corrigido passando como parâmetro para o relatório o caminho da imagem, da seguinte forma.
  • Crie um parâmetro no IReport do tipo java.awt.Image com o nome por exemplo, logo;
  • Arraste o componente de Image do IReport para o seu relatório;
  • Na aba imagem deste componente você coloca um nome no seu parâmetro, que é a imagem, por exemplo, $P{logo};
  • Agora na sua classe você precisa enviar a imagem para o relatório, existem N formas de fazermos isso, uma delas é da seguinte forma:

// Pegamos o caminho da imagem e salvamos na variavel "image" do tipo ImageIcon
   // "logo", é o nome da variavel que criamos no IReport
ImageIcon image = new ImageIcon(getClass().getResource("/br/com/dominio/projeto/report/logo.gif"));
params.put("logo", image.getImage());


Bom, é isso! rs

domingo, 10 de abril de 2016

Attack on Titan


O game "Attack on Titan", baseado no anime de mesmo nome, será lançado no Ocidente em 30 de agosto. O jogo de ação terá versões para PlayStation 4, Xbox One, PS3, PC e PS Vita. 

"Attack on Titan" acompanha os acontecimentos da primeira temporada do anime e permite que os jogadores revivam vários momentos do desenho animado. A história gira em torno do conflito entre essas criaturas gigantes que se alimentam de humanos, os tais dos Titãs, e o que restou da humanidade.

sexta-feira, 8 de abril de 2016

Debug #1 - Colocar tooltip no headerColumn usando PrimeFaces

Debug #1


Para um problema especifico que tive aqui na empresa tive que adicionar um tooltip no headerColumn do componente dataTable, coisa que não é muito comum, mas se fez necessário. Para resolver o problema eu utilizei o seguinte trecho.


 
    
Exemplo de uso:


 
    
   
 
 


Nota-se que o facet deve ficar entre a tag "< p:column>" e "< h:output>", ou qualquer outra tag que estiver usando pra apresentar seus registros na tela.


Espero ter ajudado, até a próxima!

quarta-feira, 30 de março de 2016

English NOW #2



Fala galera, blz?

Na última quarta feira fiz o primeiro de vários posts de sites que auxiliam no aprendizado em Inglês. Caso não tenha visto ,basta acessar o English Now #1 e lá falei sobre o newsinlevels.com um excelente site com texto, jokes e áudios livres para leitura e estudo.


Nesta semana a dica será o ESL Pod um site que disponibiliza vários podcasts com conteúdos ricos e não muito complexos.

Em sua página inicial é possível visualizar todos os podcasts disponíveis em ordem de divulgação, ou seja, do mais recente ao mais antigo. Na data em que fiz este post, o podcast mais recente é o English Café 548.

Os podcasts possuem diálogos que e o script de cada um disponível para que o usuário possa acompanhar, se preciso for.


Note que algumas palavras estão em negrito, pois, após a execução do diálogo - em velocidade reduzida - o host - Dr. Jeff Mcquillan explica palavra por palavra o significado delas e qual o sentido elas dão as frases e ao texto como um todo.

Este site é uma excelente ferramenta para aprimorar seu conhecimento assim como adaptar sua audição ao novo idioma.

Até a próxima!! 
:)

segunda-feira, 28 de março de 2016

Batman vs Superman: A origem da justiça - Primeiras impressões





No dia 24/03, quinta feira, estreou nos cinemas brasileiros o tão aguardado filme Batman vs Superman. Este filme é a sequência de Man of Steel (2013), traz agora o drama vivido por Bruce Wayne, após ver toda Metrópolis ser destruída na batalha entre Superman e General Zod, além da destruição da Wayne Financial juntamente com vários outros edífios da cidade. 

Neste filme é possível observar um Bruce Wayne mais experiente, amargurado e com traumas da perda de seus pais na infância tentando vingar as pessoas que morreram e sofreram com a batalha dos deuses ocorrido anteriormente. Ele acredita que "ninguém" conseguirá controlar o alien e, por isso, precisa detê-lo de todas as formas para que o pior não aconteça. 

A batalha entre os maiores super-heróis da DC, traz vários elementos existentes nos quadrinhos e isso torna a experiência de assistir ao filme muito mais interessante. Com um tom totalmente diferente dos filmes da Marvel, Batman vs Superman vem com um formato mais sombrio e com cenas mais "pesadas", pois existem atitudes que não eram esperados de super-heróis, mas que fazem todo sentido ao olhar para esse novo formato que a Warner e a DC estão propondo ao público.

Não podemos deixar de comentar sobre o Lex Luthor, o mais fomoso vilão do Superman nos quadrinhos, foi totalmente remodelado e entregue ao público como um cara psicótico e muito inteligente. Determinado a destruir o Superman, tenta de todas as formas levar o homem de aço ao chão.

A união na trindade ocorre de forma já aguardada, onde existe um poder maior que exige a interação dos três super-heróis. Muito foi se discutido a respeito dos trailers, pois foram lançados vários e muitos traziam imagens que poderiam ser reveladoras. Bem, os trailers trouxeram sim muitas imagens, mas como todos sabem, são imagens aleatórias que de certa forma não trazem a história à tona. Claro, existem algumas cenas que poderiam ser omitidas, mas mesmo assim não tirou o prazer de acompanhar o desenrolar da história.

Existem muitas referências a liga da justiça, assim como os novos personagens irão compor a equipe, porém, sem muitos detalhes. São mostrados sem nomeação ou explicação de onde vieram ou que são. Apenas uma pincelada sobre o que está por vir neste universo da DC e Warner.
Como sendo o ponta-pé inicial para a liga da justiça este filme trouxe muita novidade tanto em história quanto em parte de cinematografia. Zack Snyder propôs uma nova era de super-heróis, onde deuses gregos protegem a terra dos males que ainda estão por vir.

Agora basta aguardar com ansiedade o filme solo de Batman, agora incorporado por Ben Affleck e também pelo filme da Mulher Maravilha, interpretada por Gal Gado.
A liga da justiça está chegando, enquanto não vem, vamos aguardar e ter uma ideia assistindo Batman vs Superman: A origem da Justiça.

Pokémon GO!


Pokémon GO é a grande aposta da Nintendo para entrar com tudo no mercado de jogos mobile. O jogo é uma parceria da Nintendo e a Niantic Labs, uma companhia nascida dentro do Google, mas que se desligou recentemente.
As duas grandes novidades do jogo é o fato de não estarem em consoles e sim em dispositivos mobile e o uso da tecnologia de realidade aumentada para levar os monstrinhos para o mundo real. O jogo utilizará uma espécie de GPS para mapear os campos de batalha, fazendo com que os competidores possam se encontrar em algum deles.

A Nintendo também esta desenvolvendo um dispositivo como um relógio inteligente chamado Pokémon GO Plus, projetado para ajudar os jogadores a se localizarem no mundo do jogo sem ter que olhar no seu aparelho celular durante todo o dia. Com uma temática muito mais ou menos boa, o dispositivo vem com formato de pokébola e vai vibrar quando um pokémon estiver perto de você no mundo real.



No inicio de 2015 surgiram rumores sobre o suposto jogo que foi confirmado apenas no dia 10 de setembro do mesmo ano.
Recentemente foi informado que o jogo estará próximo de ter seu estágio beta liberado para usuário de android e iOS, mas restrito apenas no Japão inicialmente. Como a expectativa pelo Pokémon GO é muito grande, apenas uma parcela dos usuários que se ofereceram parar participar no Beta serão aceitos. Este teste inicial será feito para que os usuários ajudem a melhorar o estado atual do jogo, desde bugs a possíveis melhorias para melhorar a jogabilidade. De acordo com instruções publicadas pela Niantic Labs, os usuários que participaram da fase Beta devem manter todas as informações do jogo confidencias. Mas é claro, isso não evitará que vazamentos comecem a aparecer após o inicio do Beta (estaremos ansiosos rs).

Esse foi o vídeo usado durante a conferencia de imprensa realizada em Tóquio:

 

A jogabilidade funciona da seguinte forma: o usuário precisa caminhar até onde está o Pokémon que deseja capturar. Será iniciado um mini game em seu celular que usa a tecnologia de realidade aumentada, tendo o bichinho projetado na tela do seu aparelho como se realmente estivesse ali na sua frente.

Caso o jogador capture muitos pokémons da mesma espécie, ele terá a oportunidade de evoluir um deles. Além disso, é possível achar ovos nas PokéStops. Eles vão chocar depois que você caminhar uma certa distância. Esses ovos são uma possibilidade de conseguir pokémons que nunca apareceriam perto de sua casa. Além disso, os monstros do tipo aquático só podem ser encontrados perto do mar ou lagos, o que vai forçar os jogadores a explorar melhor os lugares em suas viagens.
O avatar dos jogadores vai subindo de nível como treinador, que são obtidos ao encontrar e capturar cada vez mais pokémons. Ao aumentar essa experiência, será possível encontrar monstrinhos mais fortes e ter acesso a melhores itens, como Great Balls, por exemplo. Essas bolas especiais também podem ser encontradas ao se explorar lugares como museus, exposições de arte, mercados públicos e monumentos.
Tudo parece ser bem interessante e ficará ainda mais desafiador ao ser informado que o jogo oferecerá os clássicos ginásios de desafios. O jogador poderá ser convidado a se juntar a uma de 3 equipes. Após isso, poderá designar pokémons capturados para representar ginásios que estejam vazios e desafiar outras equipes que tentem tomar a liderança deste ginásio.

Bom pessoal, por enquanto o negócio é aguardar, e deixar pra tirar férias da empresa quando for lançar no Brasil rs
Guardar dinheiro pra comprar um celular novo, e gasolina pro carro e sair na jornada pokémon. Abraço!

sexta-feira, 25 de março de 2016

GO GO! - Congresso de Mobile



Congresso de Mobile é um evento totalmente gratuito que acontecerá dos dias 04 a 08 de abril, 100% online.
Para poder participar basta realizar um cadastro e garantir a sua vaga.
O evento contará com palestrantes que são referência na comunidade mobile.

Congresso de mobile está na sua primeira edição, o compromisso do evento é trazer os melhores profissionais, com o objetivo de dividir as melhores sacadas, revelar tudo que gerou bom retorno.
Mas para quem é esse congresso?
O congresso é para dois tipos de pessoas, para estudantes e/ou entusiastas da área de computação ou tecnologia, que desejam ingressar no mercado de mobile E o segundo, para profissionais já atuantes que desejam dar um salto na sua carreira, escalar os seus conhecimentos.

O link das palestras será enviado via e-mail, então é necessário estar online no dia e horário informadas.
Como brinde será enviado para seu e-mail um e-book com as 7 melhores maneiras de você monetizar o seu aplicativo.

Caso tenha interesse em se aprofundar mais, será possível realizar um cadastro OURO, onde você recebera vários livros, acesso a área premium com palestras exclusivas, desenvolvimento de um aplicativo do zero utilizando a linguagem Swift e outro sistema em Unity3D. O site também enviara um certificado de 40h horas de participação na primeira edição do Congresso de Mobile.

Uma ótima oportunidade de conhecer mais sobre o mercado, aprender com quem esta nesse ramo a muito tempo e já tem um caminho pra te guiar.
Acesse o site e faça seu cadastro.

Até mais!