quinta-feira, 22 de dezembro de 2016

[JAVA] Anotação @Override


Fala galera que acompanha o blog...

Resolvi criar esse post especificamente sobre a Annotation @Override, pois é uma anotação muito comum quando estamos trabalhando com Orientação a Objetos e muita gente usa sem saber o porque de estar usando. Normalmente depois de uma refatoração o sistema para de funcionar, as vezes com umas mensagens estranhas. Então vamos entender o que acontece "por baixo dos panos".



Para início de conversa, a anotação @Override é uma forma de garantir que você está sobre escrevendo um método na super classe, e não criando um novo método.

Vamos ter como exemplo essa "Super" classe: 

public class SuperClasse {
    public void showMe() {
      System.out.println("Estou aqui SuperClasse");
    }
}

Certo, temos a nossa classe SuperClasse, que possui o método showMe(), que escreve uma mensagem no console.

Criamos uma nova classe (NovaClasse) no nosso projeto que estende a classe SuperClasse, e você gostaria de sobrescrever o método showMe(), pois é necessário que seja apresentado uma outra mensagem.  Então temos a seguinte classe:

public class NovaClasse extends SuperClasse {
       public void showMe() {
           System.out.println("Eu sou a NovaClasse");
       }
}

Perfeito! Acabamos de sobrescrever o método showMe(), da nossa SuperClasse e em momento algum usamos a anotação @Override e esse código funciona perfeitamente. Mas,  um amigo no projeto que você trabalha resolveu mudar o nome do método da sua classe SuperClasse de showMe() para showMessage().

E ai, percebeu o problema?

Nesse momento o seu projeto possui 2 métodos distintos:
SuperClasse possui o método showMessage();
NovaClasse possui o método showMe();

Se seu amigo, ou até mesmo você em uma fatoração, que seja, não se lembrar da sua classe NovaClasse que estendeu SuperClasse, que sobrescrevia um método dela... você terá um método que não está sobrescrevendo coisa nenhuma!

Mas, e se você tivesse usado a anotação @Override?

public class SuperClasse {
    public void showMe() {
       System.out.println("Estou aqui SuperClasse");
    }
}

public class NovaClasse extends SuperClasse {

  @Override
  public void showMe() {
     System.out.println("Eu sou a NovaClasse");
  }

}


Até aqui tudo certo. Mas, quando seu amigo, ou você, resolver mudar o seu método de showMe() para showMessage(), o seu código não irá compilar, pois o @Override vai perceber que não está sobrescrevendo coisa nenhuma, por não vai existir um método showMe() na classe SuperClasse() e vai te mostrar uma mensagem com de erro:

NovaClasse() must override or implement a supertype method


Dessa forma deverá ser alterar o nome do método da classe NovaClasse() também para showMessage(), para que o código volte a funcionar perfeitamente. Assim, o @Override acaba servindo como um lembrete.

Bom pessoal, um post básico, mas muito importante pra quem trabalha com Orientação a Objetos, esse exemplo foi para a linguagem JAVA, mas vários outras linguagens OO possuem a sua forma de anotação de sobrescrita, especificamente o JAVA, optou por @Override.

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!

quarta-feira, 23 de novembro de 2016

[JAVA] Encapsulamento | Modificadores de acesso


Fala galera!

Em uma das noites de desenvolvimento, me peguei pensando: "Por que não fazer um post falando um pouco sobre encapsulamento?". Para quem está iniciando na área de programação ou até mesmo quem já está um tempinho na área, pode acontecer de ter uma dúvida de como funciona ou quando utilizar. Então nesse post, vou tentar passar o que tenho de conhecimento e mais uma boa parte de pesquisas. Vamos lá!



Afinal, o que é encapsulamento? 


É um dos principais conceitos da orientação a objetos. Seu objetivo é organizar os dados relacionados, formando grupos em objetos(classes). Assim, mantém a legibilidade de um programa com milhares de linhas e também o torna fácil de trabalhar e fazer manutenções. Entende-se também por encapsulamento, a proteção da integridade da classe escondendo informações e disponibilizando somente o preciso para usar a classe. Mas lembre-se, para manter a qualidade do projeto, é necessário ter o baixo acoplamento entre as classes e o encapsulamento ajuda a manter esta característica.

Modificadores de acesso


Como o nome diz, os modificadores de acesso são utilizados para os componentes da aplicação acessíveis ou não por outras partes. Além disso, são divididos em dois níveis no encapsulamento:
  • Nível de classe: public ou package-private (default);
  • Nível de membro: public, private, protected ou package-private (default).

public

Talvez ao ler a palavra public, claramente você pensou em público. E esse é, vamos dizer assim, a ideia desse modificador. Permite que qualquer componente da classe seja acessada por outra.

protected

Esse modificador já é um pouco mais restritivo. Os componentes da classe que são protected, podem ser acessados por classes/interfaces que estão no mesmo pacote. Em caso de classes derivadas, pode ser acessado mesmo estando em pacotes diferentes.

package-private (default)

Quando não definimos um modificador de acesso a um componente, ele assume o modificador package-private (default/padrão). Neste caso, os componentes da classe só podem ser acessadas por outras que estão no mesmo pacote independente se a classe é derivada ou não.

private

O modificador private só permite que o componente seja visível somente pela própria classe. Dessa forma, podem existir classes no mesmo pacote ou em outros, podendo ser classes derivadas ou não, tudo que estiver com o modificador private não estará acessível.


Bom galera, espero que tenham curtido mais esse post. Encapsulamento é algo importante para se aprender, pois é fundamental para linguagens baseadas no paradigma da orientação a objetos.

Até mais!

;)

Fonte: 
            TI Expert
             Equipe.nce.ufrj.br
            High5Devs

quinta-feira, 17 de novembro de 2016

[MucilaCast - 003] Internet sua linda


Fala galera que acompanha o blog...

Mais um episódio do MucilaCast, com o tema "Internet sua linda". Nesse episódio falamos sobre os primeiros sites que acessávamos na internet, várias coisas curiosas que existem pela internet, principalmente uns sites, podemos dizer, bizarros que existem nessa internet maravilhosa rs


[MucilaCast - 003] Internet sua linda


Falamos também sobre algumas redes sociais e principalmente dos programas de chats utilizados antigamente, como o grande ICQ, famoso pelos seus jogos fodas, também falamos do maravilhoso MSN Messenger, muito utilizado para indiretas utilizando o campo de status e é claro que não podia faltar o famoso chat da UOL (quer TC? kkk) e diversos outros assuntos que com certeza você deve ter utilizado ou vivenciado.
Não se esqueça de deixar nos comentários, algum outro site que você acessava antigamente e do que você sente mais saudade... 



Participação:
  • Felipe Pereira de Souza;
  • Luiz Fagner Zordan;
  • Renan Rodrigues Ramos.
Música e efeitos:

As músicas utilizadas nesse podcast foram obtidas através do YouTube:
    Capa: Fagner Zordan
    Edição: Renan Rodrigues Ramos

    É isso pessoal, até a próxima!

    quarta-feira, 16 de novembro de 2016

    Uowww 10000 visualizações


    Fala galera que acompanha o blog...

    E mais uma vez: "Vocês são demais rs"!
    Depois de exatos 9 meses e aproximadamente 270 dias chegamos a marca das 10 mil visualizações!!!


    Uowww 10000 visualizações

    Atualmente o blog possui quase 150 posts, sobre diversos assuntos, clique aqui para entender como nossos posts são organizados, o que gera aproximadamente 1200 visualizações por mês *-*

    Começamos um canal de podcast, MucilaCast, que foi fundamental para a quantidade de visualizações que o blog possui. Se você não conhece nosso canal pode acessar esse link aqui e acompanhar todos os nosso episódios. Estamos com uma lista de novos episódios para serem gravados e vários deles com convidados, continue nos acompanhando para não perder nenhum episódio rs

    Muito obrigado por acompanhar o nosso blog, obrigado pelos feedbacks, pelas mensagens com sugestões de novos posts.

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


    AEWWWWW

    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!

    segunda-feira, 31 de outubro de 2016

    [MucilaCast Especial - 001] Dia das Crianças


    Fala galera que acompanha o blog...

    E nesse mês de Outubro é comemorado um dia muito divertido e alegre não só para as crianças mas pra muitos "barbudos" por ai rs


    DIA DAS CRIANÇAS UHUUUUU

    É aquele dia especial onde a criançada pode tomar sorvete, ganha aquele presente divertido e pode jogar 2 horas seguidas de vídeo game eee os marmanjos aproveita a festa pra "levar a criançada pra passear" e volta a ser criança e se divertem muitoo juntos.

    E não podemos nos esquecer das famosas frases "vou contar até 3... 1, 2", "se eu ouvir um pioo..." piuuu , "aiii se eu for ai e achar...", "vou chamar seu pai..." e várias outras frases lindas e são fundamentais pra uma boa educação rsrs

    E para comemorar esse dia, fizemos nosso primeiro episódio "MucilaCast Especial", onde vamos falar sobre os tempos de crianças, das brincadeiras, as artes e vários outros assuntos saudosos.

    [MucilaCast Especial - 001] Dia das Crianças

    Para esse episódio, convidados um amigo paraibano, que nasceu em Patos na Paraíba... Rafael Araujo Ôxiiiii!
    Rafael foi nosso primeiro convidado para gravar um episódio e foi bastante interessante. 

    Comparamos os nomes das brincadeiras de Minas com os da Paraíba, e confesso que o nome de lá são mais complicados rs


    Ahhh e deixa nos comentários o que você tem mais saudade de quando era criança, o objeto mais interessante que você tomou um coro ou alguma historia pra lermos aqui no próximo episódio.

    Faça o download ou ouça em seu navegador:

    Participação:
    • Felipe Pereira de Souza;
    • Luiz Fagner Zordan;
    • Renan Rodrigues Ramos.
    • [Convidado] Rafael Araújo
    Música e efeitos:

    As músicas utilizadas nesse podcast podem ser encontrados nos endereços:

    DanoSongs
    • Crazy from the Message;
    • Great World;
    • Heart Quake.
    • The impossebulls - 5 x 5.
    • Get The Flow
    • Zoosters

    Capa: Luiz Fagner Zordan
    Edição: Felipe Pereira de Souza

    É isso pessoal, até a próxima!

    quarta-feira, 26 de outubro de 2016

    Ransomware - Não seja uma vítima também!


    Fala galera!

    Hoje falaremos sobre um assunto muito sério e que todos devem ter o cuidado para que não caiam nessa armadilha que está assombrando muitas pessoas, principalmente empresas. 





    Se você não conhece, grave muito bem este nome: Ransomware; Certamente é um nome não muito comum, então fica mais difícil de lembrar futuramente. Então, para facilitar, relacione o nome com o termo "Sequestro de dados".

    Por que fazer essa relação?

    O site TrendMicro possui uma descrição ideal para este tipo de malware
    Ransomware é um tipo de malware que limita os usuários de acessarem seu sistema, ou por bloqueio da tela ou por bloqueio de arquivos de usuários ao menos que um resgate seja pago. Fonte: Ransomware
    Então, como pode-se perceber, este malware é capaz de bloquear seu computar ou até mesmo seus dados e, desta forma, só os libera novamente quando um pagamento é efetuado, ou seja, o valor do resgate dos dados sequestrados.


    Como funciona o Ransomware

    Existem várias formas de ser infectado hoje em dia. A internet possui muitas coisas interessantes e boas, mas também há muitos arquivos, links e sites maliciosos. Mas uma das formas mais comuns é através de e-mails. Sempres somos bombardeados por e-mails de desconhecidos com link e arquivos anexos. E um desses arquivos pode ser um possível vírus que irá deter todos os seus dados.

    Uma vez baixado em seu computador, o vírus irá criptografar todos os dados existentes em seu disco rígido. Tudo isso é feito em segundo plano de forma silenciosa, onde, após a execução, um pop-up é aberto e informa ao usuário que o sistema foi "sequestrado". 

    No site TechTudo, foi descrito um caso que aconteceu em janeiro de 2016. Em Ransomware brasileiro solicitava que fosse executado um arquivo de atualização do Adobe Flash Player. Após o usuário aceitar a "atualização", o computador da vítima é infectado e todos os seus dados sequestrados.

    Para evitar o rastreio, os criminosos utilizam outra forma de pagamento como o uso de Bitcoin. Através disso, os criminosos recebem o valor do resgate e liberam uma chave que permite ao usuário recuperar seus dados. 

    Só para se ter uma ideia, na data de edição deste post - 25/10/2016 - a cotação do bitcoin é de R$ 2.139,15.

    Obs.: em alguns casos, as pessoas ou empresas não possuem um backup para recuperar os dados perdidos, então o valor do resgate é pago, porém, o pagamento não garante que o resgate será efetuado com sucesso.

    Conclusão

    Se pudesse encerrar esse post somente com uma palavra, esta seria BACKUPB, mas seria muito importante que este backup fique localizado em outra máquina ou em um dispositivo externo, pois se estiver no mesmo computador que está infectado, de nada adiantaria. É de extrema importância você ter um backup de tudo que sua empresa ou seu computador pessoal possui, além é claro de aumentar a segurança em sua rede local seja em casa ou na empresa e também conscientização de todas pessoas envolvidas para que evitem o acesso a sites duvidosos ou links de origem desconhecida.

    É isso ae galera! Cuidado e até mais!

    ;)

    segunda-feira, 24 de outubro de 2016

    [MucilaCast - 002] Tecnologias que substituem o homem


    Fala galera que acompanha o blog...

    Hoje estamos publicando o nosso segundo episódio do MucilaCast, com o tema "Tecnologias que substituem o homem". Se você está ouvindo esse episódio entre os meses de setembro e outubro de 2016 com certeza acompanhou a greve dos bancos, a maior desde 2004, que causou diversos transtornos para a sociedade. E foi pensando nisso que resolvemos discutir sobre a evolução tecnológica e como essa evolução tem substituído/auxiliado o homem em suas atividades.





    Para gravar esse podcast, fizemos várias pesquisas sobre as diversas tecnologias que vem substituindo o homem. Entre outras tecnologias falamos  também sobre inteligência artificial, carros autônomos, impressora 3D e muito mais. 

    Faça o download ou ouça em seu navegador:




    Tem alguma sugestão, elogio, crítica ou somente trocar uma ideia? Compartilhe com a gente através dos comentários ou enviando um email para deviscoming@gmail.com.

    Participação:
    • Felipe Pereira de Souza;
    • Luiz Fagner Zordan;
    • Renan Rodrigues Ramos.
    Música e efeitos:

    As músicas utilizadas nesse podcast podem ser encontrados nos endereços:
      Capa: Fagner Zordan
      Edição: Renan Rodrigues Ramos

      É isso pessoal, até a próxima!

      sexta-feira, 14 de outubro de 2016

      Debug #13 - Definir o contexto raiz de uma aplicação WEB


      Fala galera que acompanha o blog...

      Em um determinado projeto web, vamos chama-lo de projeto-novo, estava usando a IDE Eclise Neon, Maven e jboss como servidor. Percebi que ao realizar o deploy da aplicação, subir o servidor e acessar o projeto pela url http://:/projeto-novo apresentava o famoso 404.


      Debug #13 - Definir o contexto raiz de uma aplicação WEB


      Ao acessar a pasta onde o jboss realiza o deploy, vi que o meu projeto estava com o seguinte nome projeto-novo.0.00.01-SNAPSHOT, o que nunca havia acontecido em outros projetos.

      Poderia listar N motivos para não deixar o deploy da aplicação com assim e consequentemente a url para acessar o seu projeto assim http://:/projeto-novo.0.00.01-SNAPSHOT, mas creio que já tenha percebido por si só o problema.

      Caso isso venha a acontecer no seu projeto, de aparecer a versão no deploy da aplicação, que na verdade é mais um "problema" de IDE, visto que o mesmo projeto aberto na versão Luna do Eclipse não apresenta o problema, basta criar o arquivo jboss-web.xml dentro da pasta webapp/WEB-INF, com o seguinte trecho:

      <?xml version="1.0" encoding="UTF-8"?>
      <jboss-web xmlns="http://www.jboss.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="
            http://www.jboss.com/xml/ns/javaee
            http://www.jboss.org/j2ee/schema/jboss-web_7_2.xsd">
         <context-root>/projeto-novo</context-root>
      </jboss-web>
      
      

      Observe que na tag context-root eu defini qual será o contexto da minha aplicação, e não necessariamente precisa ser o nome do meu projeto, eu poderia colocar um nome qualquer dentro da tag.

      Caso queira ler mais sobre o assunto acesse a documentação do jboss.


      É isso pessoal, até a próxima!

      quarta-feira, 12 de outubro de 2016

      [BD] Formas Normais


      Fala galera!

      Hoje vamos trocar uma ideia maneira sobre um processo muito legal de aprender e aplicar no desenvolvimento de aplicações onde se é utilizado Banco de Dados relacional. É conhecido como Normalização em banco de dados.


      Certamente já ouviram falar da normalização em alguma matéria na faculdade ou curso e observaram que é algo extremamente importante de se aplicar, mas que em alguns casos não nos atentamos e deixamos passar.

      Então, o que é normalização?

      Normalização é um processo utilizado com o objetivo de manter a organização em todas as tabelas no banco de dados, tornando-se possível evitar erros como redundância de dados, falhas em projetos e etc.
      A normalização é o processo de organizar os dados em um banco de dados. Isso inclui criar tabelas e estabelecer relacionamentos entre essas tabelas de acordo com as regras criadas para proteger os dados e para tornar o banco de dados mais flexíveis, eliminando a redundância e dependência inconsistente.
                fonte: Suporte Microsoft

      Conforme mencionado na citação acima, a normalização ajuda a evitar redundâncias e dependência inconsistente. Vamos descrever de forma simples cada um deles:

       Redundância

      A redundância existe quando um ou mais dados existem em diersas entidades (tabelas) do banco de dados, causando um grande consumo de espaço de armazenamento e problemas em manutenções. Se o mesmo dado estiver em em tabelas diferentes e for necessário atualizar, será preciso executar essa atualização e todas as tres.
      Um exemplo simples para isso é o caso do endereço do usuário, por exemplo. Se três - ou mais - tabelas tiverem o endereço, será necessário atualizá-lo em todos eles.

      Dependência inconsistente

      Os dados devem ser armazenados de acordo com a entidade. Para ficar melhor entendido veja o exemplo:
      Um usuário procura informações do cliente (como endereço) na tabela de Clientes, mas não é interessante que nesta mesma tabela o usuário encontre o salário do vendedor - responsável por esse cliente - na tabela de Clientes e sim na tabela de Funcionários.
      Ou seja, é preciso definir e separar corretamente os dados, pois, caso contrário, a busca será afetada.

      Formas Normais

      Para tratar esses problemas, o pesquisador Edgar Frank Codd desenvolveu três processos denominados Formas Normais.

      Tipos de formas normais

      • Primeira forma normal (1FN): todos os valores de colunas de uma tabela devem ser atômicos:
        • deve se eliminar grupos repetidos em tabelas individuais;
        • uma tabela separada para cada conjunto de dados relacionados;
        • cada conjunto de dados precisa ser identificados com uma chave primária;
        • importante não ter uma tabela com vários dados semelhantes armazenados.
      • Segunda forma normal (2FN): não permite a dependência funcional de atributos que não sejam chaves primária.
      • Terceira forma normal (3FN): não ter campos que não dependam da chave. Exemplo: uma tabela de Cliente, onde possui o município de cada cliente. Para que seja possível existir uma listagem de municípios o ideal seria ter uma tabela de Município separada e fazer o vínculo com a tabela Cliente utilizando uma chave.

      Outros tipos de formas normais

      Existem, além das Formas mencionadas, outras Formas Normais que podem também ser aplicadas no desenvolvimento de um banco. Estas outras podem ser vistas nesse link, onde existe uma explicação mais detalhada de cada uma delas.

      Bom pessoal, espero que tenham curtido esse post. Certamente é um conceito muito importante de saber e aplicar, pois na área em que trabalhamos qualquer e toda melhoria é essencial para o correto funcionamento de nossos projetos.

      Até mais!

      segunda-feira, 10 de outubro de 2016

      O que são ChatBots?


      Fala galera!

      Acredito que a maioria de vocês já ouviram falar em ChatBots. Caso não conheça, saiba que você pode ter interagido com um deles e nem percebeu. Vamos falar um pouco deles então?




      O que são chatbots?

      Chatbot é nada mais nada menos que um programa que tenta simular uma pessoa em conversas via mensagens de texto com uma pessoa real, ou seja, você pode ter acessado um site e conversado com um atendente online, porém este atendente não existe fisicamente. É um bot, ou melhor, em nosso contexto, um chatbot.
      Os chatbots são o uso desta ferramenta para criar conversas -chats-, gerenciando perguntas e respostas durante uma interação com pessoas reais.
      fonte: Midiatismo

      Chatbots conhecidos

      Apesar de parecer uma técnica nova, já existem algumas ferramentas que já a utilizam como o:

      • Telegram: existe uma API disponível para desenvolvedores que permite o desenvolvimento de bots para diversas funcionalidades como ensinar, jogar, pesquisar, etc;
      • Whatsapp: apesar de não fornecer uma API como o item anterior, existe um app chamado Max que faz um gerenciamento de grupos do whatsapp tornando fácil, por exemplo, o agendamento de um encontro e/ou confirmação das pessoas que comparecerão.
      Uma dica legal para quem quer conhecer melhor essa tecnologia ou saber como é a interação com um bot em uma conversa e, ao mesmo tempo, aprender inglês, faça o download do aplicativo Andy. Este aplicativo é muito interessante, pois o bot conversa com o usuário em inglês e ainda lhe fornece várias dicas sobre o idioma.


      Abaixo vou deixar os links comentados neste post. Espero que tenham gostado e quem sabe alguém goste dessa ideia e decida fazer um chatbot e nos mostrar o resultado? hehe

      Até mais!

      Links: 

      domingo, 9 de outubro de 2016

      Acesso Pluralsight


      Fala galera que acompanha o blog...

      Recebi um email hoje de manhã de um amigo, referente a cursos online FREE da Pluralsight e gostaria de compartilhar com vocês.


      Para quem não conhece a Pluralsight é uma das melhores, senão a melhor, plataforma de treinamentos online. Possui quase 5000 cursos nas áreas de desenvolvimento, infraestrutura, dados, entre outras e que são ministrados por mais de 800 especialistas.

      Acesso Pluralsight

      Veja a lista com os cursos mais populares dessa plataforma:

      • Building a Web App with ASP.NET Core RC1, MVC 6, EF7 & AngularJS
      • Angular 2: Getting Started
      • ASP.NET Core 1.0 Fundamentals
      • C# Fundamentals with Visual Studio 2015
      • Building Applications with ASP.NET MVC 4
      • JavaScript Best Practices
      • ASP.NET MVC 5 Fundamentals
      • TypeScript Fundamentals
      • Docker for Web Developers
      • Applying Functional Principles in C#
      • ASP.NET in Multi-tenant App, Examples in MVC, ExtJS, and Angular
      • Python Fundamentals
      • Java Fundamentals: The Java Language
      • Rapid JavaScript Training
      • C# Best Practices: Improving on the Basics
      • Design Patterns Library
      • Getting Started with Entity Framework 6
      • Rebuilding Web Forms Applications in MVC
      • Advanced JavaScript
      • Building Your First Xamarin.Android App from Start to Store
      • Building Web Applications with Node.js and Express 4.0
      • WCF End-to-End
      • WPF and MVVM: Test Driven Development of ViewModels
      E ai o que achou? Despertou aquele interesse em algum desses cursos?
      Que tal ganhar uma assinatura de 6 meses, com acesso completo à toda coleção de cursos e começar a aprender novas linguagens, diferentes tecnologias e muito mais que a plataforma de proporcionará?

      Bom, basta clicar nesse link aqui, colocar seu email que deve ser da Microsoft. E seguir os passos.

      Depois de ter acesso o sistema, na guia Featured, o último item é referente a Pluralsight. Clique em Get Code e ative seu código. Um formulário deverá ser preenchido e após a confirmação do cadastro você terá seu acesso liberado!

      Não perca essa oportunidade, aprimore seus conhecimentos, faça cursos novos, compartilhe com seus amigos.

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