segunda-feira, 23 de maio de 2016

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

Dando continuidade na sequência de posts sobre "Diferença entre String, StringBuilder e StringBuffer", hoje vamos comparar a velocidade de processamento entre StringBuilder e StringBuffer. Sugiro dar uma olhada nos post anteriores, caso ainda não tenha visto, clicando aqui.

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

StringBuilder e StringBuffer são muito rápidos para concatenação de Strings comum e exercem a mesma função, com a principal diferença que, enquanto o StringBuffer é sincronizado, o StringBuilder não!
Imagine várias threads lendo ou alterando a mesma String, e você precisa manter a consistência do do seu código, para esses casos o ideal é utilizar StringBuffer.

No teste a seguir você vai perceber que StringBuilder é mais rápido do que o StringBuffer. Veja o código abaixo:
  • Comparando performance de StringBuilder e StringBuffer
public class ConcatenaString {

    public static void main(String[] args) { 
              
        // Trecho de código para StringBuffer
        StringBuffer strBuffer = new StringBuffer();
        long tStart = System.currentTimeMillis();
        for (int i = 0; i < 100000; i++) {
            strBuffer.append("f");
        }

        long tEnd = System.currentTimeMillis();
        long tResult = tEnd - tStart;
        System.out.println("Tempo de execução com StringBuffer = " + 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 StringBuffer = 5 ms
Tempo de execução com StringBuilder = 3 ms

Muito bem, vimos os problemas em usar String para concatenar utilizando o operador "+", as possíveis soluções para evitar problemas de processamento, vimos a principal diferença entre StringBuilder e StringBuffer, mas e aí? Quando eu devo utilizar o operador "+" para concatenar Strings? Existem situações em que o operador "+" é utilizado, e são aqueles onde queremos manter a qualidade do código em relação a identação, para facilitar a legibilidade do código, sem a necessidade de criar um novo objeto, que também é conhecido como "mult-line Strings".
Veja o código:

public class ConcatenaString {

    public static void main(String[] args) {

        /**
         * Apenas melhorando a legibilidade, sem criar novos objetos
        */
        String strFinal = "Pessoal "
                            + "seja bem vindo "
                            + "ao blog "
                            + "DevIsComing!";

        /**
         * Outro exemplo de uso sem compromoter o desempenho
        */
        int a = 5;
        int b = 15;
        System.out.println("a é igual=" + a + " e b é igual=" + b + " certo!?");
    }
}


Pessoal acabamos por aqui.
Até a próxima!

Integração Advpl x Word #1

Fala galera!

Há um tempinho fiz um post sobre integração Advpl com o Excel (parte #1 , parte #2) e hoje vou passar para vocês umas dicas sobre integração Advpl e Word. Esta é uma integração muito útil para se aplicar em seu sistema, principalmente em casos onde tem a necessidade de preencher vários documentos.


Integração Advpl x Word #1



NOTA: informo que até a data de publicação deste post, a versão 2016 do Word ainda não foi homologada pela Totvs. Portanto, alguns casos de integração funcionam com esta versão (meu caso :D), mas para versões anteriores tudo funciona normalmente. A codificação é independente da versão.

Documento Word

Antes de iniciarmos com a programação, precisamos configurar o nosso arquivo word para receber os dados do Protheus. 

Vamos acessar o Word e criar um novo documento:

Integracao_Advpl_Word


Após o documento criado, vamos inserir as variáveis que receberão os valores enviado pelo Protheus.
Acesse a opção Inserir -> Partes Rápidas -> Campos:


Integracao_Advpl_Word

Vá até a opção DocVariable e no campo Novo Nome: insira o nome da variável que você utilizará no fonte da sua rotina. Neste caso, estou utilizando o nome dos campos da tabela.


Se você clicar com o botão direito no local que o cursor está posicionado, poderá visualizar a formatação onde está a variável.

Após estes passos seguidos, salve o arquivo em um diretório de sua preferência utilizando a extensão .dot ou .dotx.
No próximo post passaremos para a parte da codificação, onde será explicado detalhadamente cada parte do código.

Até mais!

;)

domingo, 22 de maio de 2016

[VAZOU] Download - Game Of Thrones SO06E05

Pessoal não é o foco desse blog, postar links para download de episódios, mas como um fã de GOT, não posso deixar de compartilhar esse episódio que vazou na internet.

[VAZOU] Download - Game Of Thrones SO06E05


Segue o link para fazer download do arquivo torrent:


E para facilitar a sua vida e conseguir a legenda, veja esse post onde explico a melhor forma de conseguir legenda para seus filmes e séries!

Eu ainda não assisti, fiz o download e parei aqui para compartilhar com vocês, mas dei uns cliques no episódio e realmente é um episódio original.

E por favor após assistir nada de spoilers hahahaha ou não [666]

Até a próxima!

quinta-feira, 19 de maio de 2016

Ferramentas #3 - CamScanner

Pessoal, conheci um aplicativo hoje e não pude deixar de compartilhar com vocês.
Foi uma amiga aqui da empresa que me mostrou!

Imagine você precisando digitalizar arquivos, e não possui um scanner! Ou seu scanner está estragado! que é o meu caso, mentira eu nem tenho um scanner rs
Você precisa ir até uma papelaria e toda aquela trabalheira.


Ferramentas #2 - CamScanner


Existe um aplicativo que se chama "CamScanner", que é muito eficiente e possui versão FREE!
Basta você posicionar o documento que será digitalizado sobre uma superfície e tirar uma foto usando o aplicativo, mas não se preocupe o que está do lado, no fundo... O aplicativo resolve isso pra você, e exatamente ai que ele é diferente de uma simples foto com seu celular, como poderiam estar pensando.

Após tirar a foto, o aplicativo identifica qual o foco principal e cria uma caixa de redimensionamento ao redor do arquivo, onde é possível fazer os ajustes necessários. Dessa forma tudo em volta do seu documento é removido!

Além de digitalizar o documento, é possível fazer ajustes de iluminação na imagem, clarear, preto e branco, escala de cinza. Feito isso você escolhe se possui mais documentos para ser digitalizado, criando assim uma página pra cada documento em um arquivo só, ou vários documentos em vários arquivos separados.

E finalmente enviar por email, compartilhar no google drive, whatsapp!

Espero que o aplicativo possa te ajudar, tanto quanto tem sido útil pra mim.
Pra baixar direto no Google Play, segue o link.

Até a próxima!

quarta-feira, 18 de maio de 2016

SyntaxHighlighter #1 - Sobre

SyntaxHighlighter é uma ferramenta que permite formatar texto para uma sintaxe definida de modo a facilitar a leitura e organização do texto. Muito usada por blogs de tecnologia, onde se faz necessário escrever trechos de códigos em diferente linguagens de programação e fazer marcações para facilitar a explicação do trecho de código.


SyntaxHighlight #1 - Sobre


Em resumo é esse carinha aqui:
public class Fibonacci {
 
    static long fibo(int n) {
        if (n < 2) {
            return n;
        } else {
            return fibo(n - 1) + fibo(n - 2);
        }
    }
 
    public static void main(String[] args) {   
 
    // Imprime os 20 primeiros termos       
    for (int i = 0; i < 20; i++) {
            System.out.print("(" + i + "):" + Fibonacci.fibo(i) + "\t");
        }
    }
}


As ferramentas mais conhecidas para este fim são:


E aqui no blog nos utilizamos o SyntaxHighlighter (vamos chamar se SHL), sem nenhum motivo em particular, tínhamos que escolher um e o SyntaxHighlighter possui maior quantidade de usuários o que facilita resolver problemas que venham a acontecer.

Mas essa ferramenta não é nativa do blogspot é necessário uma configuração.
Precisamos adicionar aquivos .css e .js para que o SHL funcione, além de adicionar uma marcação no texto para ser interpretado e formatado para a linguagem escolhida.

Para obter o resultado apresentando no inicio do post precisamos adicionar a marcação no corpo do nosso texto:
// o código que será formatado aqui
Nos próximos post eu vou ensinar onde conseguir os arquivos necessários para a configuração, como integra-lo ao seu blog, as linguagens que o SHL trabalha e alguns macetes rs

Até a próxima!

O que é uma CDN?

CDN (Content Delivery Network) é uma rede de distribuição de informação que permite fornecer conteúdo Web de uma forma mais rápida a um grande número de utilizadores, distribuindo o conteúdo por múltiplos servidores.

Essa explicação é simples e objetiva e também fácil de encontrar em qualquer canto da internet.
Mas eu gostaria de explicar minuciosamente o que é na verdade a CDN, e como ela "controla a internet que você usa".

O que é uma CDN?


Imagine por exemplo que a empresa DEVIC (Developer is Coming rs) libera uma atualização para um software e o servidor onde essa atualização está hospedada encontra-se na América. Até aqui tudo normal.
Agora imagine que para esse sistema temos vários usuários pelo mundo todo, e que a Europa é o principal usuário desse software, também precisa fazer o download dessa atualização. Dessa forma torna-se muito mais cômodo utilizar uma rede de distribuição de conteúdo com servidores localizados em vários pontos do mundo para permitir que os usuários Europeus tenham um acesso mais rápido a atualização.

Outro cenário: sua empresa cresceu muito, você exporta para a China, porém seu site em mandarim leva 40 segundos para ser exibido em Pequim. Você atende do sul ao norte mas a qualidade só é aceitável no sudeste. Sua empresa exporta para a Ásia, mas seu site só pode ser visto nas Américas.

E por último: quantos usuários eu espero para datas comemorativas, como dia das Mães e o Natal? Onde segundo pesquisas são os melhores períodos de venda.
Como prever a demanda?
Para suportar essa demanda eventual a infraestrutura do seu serviço precisa estar muito bem balanceada, mas o que devo considerar a mediana de acessos? a maior demanda?

Todo esse drama chega ao fim. Tudo está resolvido, e o aplicativo é um sucesso.
A proposta da rede distribuída de CDN é resolver todas os pontos citados de maneira, simples e elegante, sem que tenhamos alem dos problemas de desenvolvimento e infraestrutura que nos preocupar com o que não está no nosso controle: a internet.

Para o exemplo da atualização com clientes espalhados pelo mundo, teríamos o mesmo arquivo de atualização espalhados por vários servidores de forma que casa usuário possa acessar a atualização nos servidores mais próximos, onde um usuário Francês tenha o conteúdo ofertado por servidores na França, o usuário brasileiro recebe seu conteúdo também regionalizado. Isso significa:
  • ausência de infraestrutura própria para disponibilizar o conteúdo;
  • menor latência e maior banda para download.
Uma das primeiras e mais básicas funcionalidades da CDN é cachear o conteúdo para o usuário final, o mais próximo possível dele.



E para as datas comemorativas, como a CDN pode nos auxiliar?
O servidores onde estão hospedados os serviços, ficam responsáveis por subir máquinas ou desligar máquina, dessa forma você nunca terá máquinas ociosas, gastando uma fortunas para mante-las no ar, quando na verdade não está sendo necessário.
Ou seja, quando seu serviço tiver uma demanda baixa, poucas máquinas estarão ligadas disponibilizando serviço, quando a demanda aumenta, as máquinas passam a funcionar para suportar a quantidade de acessos.

Hoje a maior CDN do mundo é a Akamai e possui mais de 130mil servidores, reunindo vários nomes fortes do mundo da tecnologia em sua lista de clientes. Essa mesma rede suporta em dias normais 6Tb/seg de tráfego. Aproximadamente 30% de toda a internet mundial.

Até a próxima!

terça-feira, 17 de maio de 2016

Debug #8 - Android: teclado sobre o EditText


Fala galera!

Não sei se já comentei aqui no site, mas estou estudando desenvolvimento de aplicativos Android e confesso a vocês, é uma área sensacional. Vale muito se envolver com essa área de desenvolvimento.

Bom, e como todo iniciante (noob ainda rsrsrs) me deparei com um probleminha que custei para descobrir qual a possível solução, pelo menos a que atendeu ao que esperava.


Gostaria de já deixar claro que é aconselhável utilizar o Android Studio, pois é uma IDE completa para este fim e o Google não dá mais suporte para o Android Eclipse Tools (veja aqui).

A ideia é a seguinte, utilizo o Eclipse Mars para desenvolvimento de aplicativos e tenho uma activity chamada activity_main.xml, é uma tela simples com dois campos de texto (EditText) e um label (TextView) para cada (código abaixo).

<LinearLayout android:layout_height="fill_parent" android:layout_width="fill_parent" android:orientation="vertical" android:scrollbarstyle="insideInset" xmlns:android="http://schemas.android.com/apk/res/android">

    <TextView android:layout_gravity="center" android:layout_height="wrap_content" android:layout_margin="20dp" android:layout_width="wrap_content" android:text="@string/lbl_nova_tarefa">
                  
        <TextView android:id="@+id/lblTitulo" android:layout_ name="code"height="wrap_content" android:layout_margin="10dp" android:layout_width="match_parent" android:text="@string/lbl_titulo">

        <EditText android:id="@+id/edtTitulo" android:inputtype="text" android:layout_height="wrap_content" android:layout_margin="10dp" android:layout_width="match_parent" android:typeface="serif">
        
        <TextView android:id="@+id/lblDesc" android:layout_height="wrap_content" android:layout_margin="10dp" android:layout_width="match_parent" android:text="@string/lbl_descricao">
     
        <EditText android:id="@+id/edtDesc" android:inputType="textMultiLine" android:layout_height="wrap_content" android:layout_margin="10dp" android:layout_width="match_parent" android:scrollbars="vertical">         
</EditText></TextView></EditText></TextView></TextView></LinearLayout>


Pois bem, quando acessava o segundo EditText (@id/edtDesc), o teclado do android ficava sobre o campo, com isso, não era possível visualizar o que era digitado.

Ao acessar o developer.android.com, encontrei o atributo android:windowSoftInputMode. Este atributo, conforme descrito no site, afeta duas coisas:

  • O estado do teclado virtual - se ele está escondido ou visível - quando a atividade torna-se o foco da atenção do usuário.
  • O ajuste feito para a janela principal da atividade - se é redimensionada menores para dar espaço para o teclado virtual ou se o seu conteúdo deslocar para fazer o foco atual visível quando parte da janela é coberto pelo teclado virtual.
Então, para que pudesse solucionar meu problema, utilizei o valor "adjustPan", onde é responsável por redimensionar a janela da activity principal, deslocando o teclado para que o foco atual não seja escondida pelo usuário.
Dessa forma, basta somente adicionar o seguinte código ao seu arquivo AndroidManifest.xml:

android:windowSoftInputMode="adjustPan"

Bom galera, espero que tenham curtido essa dica. Ressalto que o plugin do android para Eclipse não está mais recebendo suporte, pois o Google agora possui uma IDE voltada somente para desenvolvimento Android, o Android Studio. Vale a pena dar uma olhada nessa IDE, possui muitas ferramentas que auxiliam no desenvolvimento do seu aplicativo.
Falarei disso em um próximo post.

Até mais!

;) 

Problemas com SyntaxHighlighter ao usar CDN do Google

Pessoal hoje tivemos um problema com nosso blog em relação ao uso do SyntaxHighlighter. Essa ferramenta facilita a escrita em linguagens estruturadas como linguagens de programação ou linguagens de marcação (que é o caso do nosso blog), já que as estruturas e os erros de sintaxe são facilmente distinguidos.

O problema é que estávamos usando a CDN (Conten Delivery Network) do Google que era o link: http://syntaxhighlighter.googlecode.com/svn/trunk/Scripts/shCore.js e vários outros links necessários para para que o SyntaxHighighliter funcionasse.


Problemas com SyntaxHighlighter ao usar CDN do Google


No entanto ao tentar acessar o link, você não tem mais a página (pode ser que já tenha voltado rs), mas até o momento a página se encontra fora do ar.

A solução foi alterar de CDN, onde antes apontávamos para a Google, agora estamos apontando para o próprio site da ferramenta:
"http://alexgorbatchev.com/pub/sh/current/scripts/shCore.js"

Para fazer as alterações, usando blogspot, vá até o menu Modelo e clique em Editar HTML. Localize onde estão os scripts responsáveis pelo controle da ferramenta, para facilitar pesquise por "syntaxhighlighter" ou "
" e altere todos os caminhos, deixando da seguinte forma:
// Inicio configuracao do Syntax Highlighting
<link href='http://alexgorbatchev.com/pub/sh/current/styles/shCore.css' rel='stylesheet' type='text/css'/>
// configuracao do tema, css usado, default, branco, inicio
<link href='http://alexgorbatchev.com/pub/sh/current/styles/shThemeDefault.css' rel='stylesheet' type='text/css'/>
// configuracao do tema, css usado, default, branco, fim
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shCore.js' type='text/javascript'/>
 
// adicionando Script para SyntaxHighlighter
<script type='text/javascript'>
  SyntaxHighlighter.config.bloggerMode = true;
  SyntaxHighlighter.all();
</script>

// Configuracao de linguagens usadas, inicio
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJScript.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushBash.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushSql.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushXml.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCpp.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJava.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPhp.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPerl.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushDelphi.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPlain.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushDiff.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushVb.js' type='text/javascript'/>
// Configuracao de linguagens usadas, fim
 
// fim configuracao do Syntax Highlightinghttp://www.deviscoming.com/2016/05/problemas-com-syntaxhighlighter-ao-usar.html

segunda-feira, 16 de maio de 2016

Debug #7 - Tabelas sem permissão de acesso (Oracle)

Em uma aplicação onde uso o banco de dados Oracle, tive um problema ao tentar realizar um select na tabela e o erro retornado era "table or view does not exist".

Primeiro passo, abri meu gerenciador de banco de dados, a tabela estava lá, então ela existia. Mas além da possibilidade da tabela não existir (que é o que a mensagem descreve), esse erro acontece também quando o seu usuário não tem as permissões necessárias para uso da tabela. E esse era o meu problema!


Debug #8 - Tabelas sem permissão de acesso (Oracle)


Como era um select simples,foi fácil identificar a tabela que "estava com problema". Mas em casos onde possui vários joins, pode ficar dificil identificar qual tabela não possui as permissões necessárias.
Para auxilia-los e verificar quais são as tabelas que o seu usuário não possui permissões use o script abaixo:

WITH PRIVILEGIO AS (
        SELECT * FROM SYS.DBA_TAB_PRIVS P
         WHERE (P.OWNER = 'USUARIO_01')
           AND (P.GRANTEE = 'USUARIO_02')
           AND P.PRIVILEGE = 'SELECT'
  ), OBJETO AS (
        SELECT O.OBJECT_NAME NOME FROM DBA_OBJECTS O
         WHERE (O.OWNER = 'USUARIO_01')
           AND O.OBJECT_TYPE IN ('TABLE', 'VIEW', 'SEQUENCE', 'SYNONYM')
  )
SELECT *
  FROM OBJETO O
  LEFT OUTER JOIN  PRIVILEGIO P ON O.NOME = P.TABLE_NAME
 WHERE P.PRIVILEGE IS NULL;


Os valores "P.OWNER" e "P.GRANTEE" são os nomes do seu usuário, na minha aplicação eu tenho um usuário se banco de dados "usuario_01" e um usuário da aplicação "usuario_02".

O valor "P.PRIVILEGE", são os tipos de privilégios que você pretende verificar se foram liberadas. E o valor de "O.OBJECT_TYPE" é onde você quer verificar se as permissões foram liberadas.

Todos os lugares onde seu usuário não tiver permissão será listado, considerando o seu escopo de busca em OBJECT_TYPE.
Legal, mas e para liberar permissão?

Você usa esse script aqui:

GRANT SELECT ON NOME_DA_TABELA TO NOME_DO_USUARIO;

Bom, é isso qualquer dúvida deixa seu comentário.
Até a próxima!

quinta-feira, 12 de maio de 2016

GO GO! Hangout PDJ - As 5 únicas etapas para desenvolver seu jogo

E ai pessoal, tudo bom?

Hoje, dia 12/05, vai acontecer outro Hangout com Raphael Dias do PDJ explicando sobre as "5 únicas etapas para desenvolver seu jogo", totalmente grátis e online.


GO GO! Hangout PDJ - As 5 únicas etapas para desenvolver seu jogo


Para participar, basta se cadastrar no link (Quero me cadastrar) e ficar de olho no seu email que Raphael vai te mandar o link onde acontecerá o Hangout.

Ah! E diferente dos outros hangouts, esse não será gravado, por isso se programe para não perder a oportunidade, essa é a sua chance.

Abraço e sucesso!