Às vezes, conectamos em servidores via SSH e não fazemos ideia de qual distribuição aquilo veio. Simplesmente não sabemos se onde acabamos de cair é um Debian, Ubuntu, Fedora, Suse, CentOS… Isso porque, dependendo da distribuição, temos algumas ferramentas já instaladas a toque de caixa, enquanto outras você precisa instalar e configurar algumas coisas na mão. Mas chega de papo. Vamos ver como descobrir isso.

Serão apresentadas opções para fazer isso. Como as distribuições são diferentes, uma opção pode não funcionar na detecção. Aí, tente outra.

Opção 1: Boot Time Messages

Abra o terminal e digite:

Saídas:

SUSE

Linux Mint

Repare que para o Linux Mint, essa opção não funcionou. Teremos que testar as outras opções.

Ubuntu

A saída do Ubuntu é muito parecida com a do Ubuntu, afinal Linux Mint é derivação do Ubuntu. Mas ambas não nos ajudam.

Opção 2: Usando /proc/version

Abra o terminal e digite:

Saídas:

SUSE

Linux Mint

Olha que estranho. Esse comando nos mostra que estamos no Ubuntu, quando na verdade estamos no Linux Mint. Pelo Mint ser baseado no Ubuntu, isso pode ocorrer mesmo, assim como pode ocorrer em distribuições que, por sua vez, são baseadas em outras distribuições. 

Ubuntu

Novamente igual a do Linux Mint. Parece que estamos usando o mesmíssimo sistema operacional.

Opção 3: Usando /etc/issue

Abra o terminal e digite:

Saídas:

SUSE

Linux Mint

Repare, que ao contrário da opção 2, aqui é mostrado realmente que a distribuição é o Linux Mint e não o Ubuntu.

Ubuntu

Agora sim! Ubuntu e Linux Mint realmente diferenciados.


Espero ter ajudado!

Fonte:

Geralmente, em aplicações standalone no Java, distribuímos arquivos empacotados em JAR. Por questões de segurança, muitos clientes barram a execução arquivos JAR que não estejam assinados. Quando se usa Java Web Start, via JNLP, também o JAR é barrado. Sendo assim, para resolver esse problema, podemos auto-assinar no JAR. Vamos ver como se faz isso:

Empacote o JAR

A primeira coisa a se fazer é compilar e buildar sua aplicação e em formato JAR. Se você usa Ant, Maven, Gradle… Basta buildar usando eles e gerar o JAR. Depois de gerado o JAR, empacote com esse comando:

Criando a KeyStore

Agora vamos criar a KeyStore para poder assinar o JAR.

Assim que você rodar o comando, será perguntado diversas coisas como organização, nome, etc etc etc. Preencha as informações.

Assinando o JAR

E finalmente, assinando o JAR:

Agora você já pode fazer deploy, usar JNLP etc. Mas fique atento que JARs auto-assinados gera um warning na JVM quando vai executa-los.

GIST

Os comandos usados nesse post estão nesse GIST e disponíveis via MIT License.

A maioria dos desenvolvedores já passaram por problemas de encoding de textos. Seja em arquivos, códigos-fontes e principalmente em banco de dados. O MySQL suporta diversos encodings. O correto é sempre começar um projeto em UTF-8 e mante-lo sempre assim. No entanto, muitos projetos legados ainda utilizando o encoding ISO-8859-1, que no MySQL é o famigerado “Latin1“, então se quiseremos importar dados em Latin1 para o MySQL, precisamos especificar. Mas como fazer isso?

Presumindo que você tenha:

  • O MySQL Client instalado;
  • Que a database (schema) do seu projeto esteja criado em Latin1;

1. Conecte no Banco de Dados:

Preste atenção no penúltimo parâmetro onde especificamos o encoding da importação.

2. Inicie a Importação:

Pronto, agora os dados estão sendo importados.

Atenção. Não execute as importações desas forma. Má prática.

Código Fonte

Os códigos acima estão sob licença MIT e podem ser consultados nesse GIST.

O Java / JDK oferece uma API nativa para a manipulação de arquivos ZIP. Aliás, é uma excelente API e da para fazer bastante coisa com ela. Aqui vamos mostrar alguns exemplos bem simples de como extrair um arquivo de dentro de um arquivo ZIP usando essa API.

Extraindo um arquivo por nome

Nesse exemplo, iremos pegar o nome do arquivo passado por parâmetro e iremos extrair ele de dentro de um arquivo.zip. Repare que iremos obter o InputStream do arquivo. Não estamos escrevendo o arquivo para disco.

Mais exemplos

Você pode consultar mais exemplos de manipulação de arquivos Zip usando Java aqui, aqui e aqui.

Código Fonte

O código acima está disponível sob MIT e pode ser consultado nesse GIST.

Uma dúvida comum entre os desenvolvedores é como utilizar e configurar o Spring para ser usado em aplicações “standalone”, ou seja aplicações sem ser web e relativamente simples, para serem rodadas localmente. Muita gente acha que isso não é possível e é aí que eles se enganam. O Spring não é um framework web. O Spring é um framework prioritariamente de inversão de controle e injeção de dependência. Então ele pode ser usado praticamente em qualquer aplicação Java.

Vamos ver como podemos usa-lo em uma aplicação Standalone.

Adicionando a dependência

Primeiro, adicionamos a dependência do Spring Framework em nossa aplicação. Lógico, que se você precisar de outras dependências ou outros frameworks do próprio Spring, você poderá adicionar.

Gradle

Maven

Criando classes de configuração

Até um certo tempo atrás, quase todas as aplicações eram configuradas via XML. Hoje o Spring já nos permite configura-lo programaticamente por anotação, o que deixa nossa vida muito mais fácil. Para configurarmos ele, crie uma classe qualquer e anote ela igual os exemplos abaixo. Veja no GitHub depois, todo o código-fonte desse projeto para ter mais noção do que está acontecendo. Lá você encontra as classes como FakeRepo  e FakeService .

Criando classe principal e registrando a configuração

Agora vamos criar nossa classe principal, ou seja, onde nossa aplicação irá começar. A primeira coisa que temos que fazer é indicar para o Spring onde estão as classes (ou classe) de configurações dele (que fizemos no exemplo acima). Depois disso, nossa aplicação pode funcionar normalmente.

Agora basta executar o código e ver a sua aplicação funcionando e o Spring injetando as dependências normalmente.

Download do código

Todo o código feito nesse post está disponível sob licença MIT. Você pode fazer o download, fork ou clone no GitHub. Lá no GitHub o código está com exemplos maiores e mais completo. Vale a pena dar uma olhada.

Os filtros são classes que podem receber todos os requests da sua aplicação, fazer determinado processamento ou checagem e enviar o request para continuar o processamento normalmente. Eles são muito úteis quando precisamos fazer algo comum entre todos os requests, como checar a presença de um header específico, validar determinado parâmetro e assim vai. A imagem abaixo pode ajudar a entender bem como funciona um filtro.

Servlet Filter

Como configurar o filtro em uma aplicação Spring Boot?

Para configurar um filtro em uma aplicação Spring Boot é bem simples. A primeira coisa que devemos fazer é criar a classe de Filtro propriamente dita, como abaixo.

Repare nas anotações e que a classe implementa a interface Filter . O filtro precisa ser um @Component  Spring e você pode (não é obrigatório) definir a ordem de execução de diversos filtros na sua aplicação com a annotation @Order .

Depois, basta configurar um bean na classe de configuração chamado FilterRegistrationBean  com o seu Filtro, conforme exemplo abaixo.

Pronto. Seu filtro está configurado e pronto para uso. Não precisa de mais nenhuma configuração.

Fontes

Os códigos dos exemplos acima estão disponíveis nesse GIST e estão sob licença MIT.

Em Java é muito fácil usar Threads e há duas maneiras bem popular. Uma é estendendo a classe Thread  e outra implementando a interface Runnable (há também a forma implementando a interface Callable ). Não vou entrar em comparações dizendo qual é a melhor maneira, se é Thread  ou Runnable . Tem gente que defende usar Thread  e tem gente que defende usar Runnable . Mas se mesmo assim você quer ler sobre o assunto, veja essa discussão no stackoverflow e essa. aqui. Vamos aos exemplos.

Implementaremos duas classes para cada forma. Uma produtora e uma consumidora. Elas só vão simular essas ações, não irão de fato produzir ou consumir algo. Então essas classes paralelamente, em suas execução irão entrar em um laço pela quantidade de “produtos” a consumir ou produzir, dormirão por período randômico entre 1 e 5 segundos e então finalizarão. Vamos ver os códigos.

Usando Thread

Producer

Consumer

Usando Runnable

Producer

Consumer

Chamando os exemplos

Finalizando

Os códigos mostrados aqui estão disponíveis para download no GitHub sob licença MIT.

O Java 8 trouxe algumas novidades com relação a loops em listas e collections. Nesse post simples, há exemplos de como executar o mesmo loop de formas diferentes. Vamos usar a collection abaixo de exemplo para todos os métodos de exemplo no post.

Usando Simples ForEach

Foi colocado na JDK a partir da versão 1.5. Acredito que seja um dos mais usados hoje.

Usando Iterator

Colocado na JDK a partir da versão 1.2. Ele não é um for-each clássico, porém ele possui a vantagem de podermos manipular a collection enquanto nós a percorremos.

Usando Lambda ForEach

Adicionado na versão 8 do Java. Utiliza as funções lambdas para percorrer as listas. Veja só.

Usando Stream com ForEach

Também adicionado no Java 8 e também utiliza das funções lambdas para fazer os loops. No entanto, aqui nós usamos o Stream para filtrar uma lista e mostrar o resultado com o foreach.

Finalizando

Todo o código em uma única classe executável, pode ser encontrado aqui nesse Gist. Ele também está licenciado sob MIT.

Segurança

Elaborei alguns exemplos de como gerar hashes usando a plataforma Java. Nesse post, vou mostrar como usar as próprias bibliotecas da JDK (Java Development Kit) para gerar os hashes e também a biblioteca útil commons-codec  da Apache. Mas antes de irmos direto para os códigos, vamos dar uma olhada na definição do que é hash.

O que é hash?

Vamos dar uma olhada na Wikipedia para buscarmos uma definição sobre o que é hash.

Uma função hash é um algoritmo que mapeia dados de comprimento variável para dados de comprimento fixo. Os valores retornados por uma função hash são chamados valores hash, códigos hash, somas hash (hash sums), checksums ou simplesmente hashes.

Um hash (ou escrutínio) é uma sequência de bits geradas por um algoritmo de dispersão, em geral representada em base hexadecimal, que permite a visualização em letras e números (0 a 9 e A a F), representando um nibble cada. O conceito teórico diz que “hash é a transformação de uma grande quantidade de dados em uma pequena quantidade de informações”.

Essa sequência busca identificar um arquivo ou informação unicamente. Por exemplo, uma mensagem de correio eletrônico, uma senha, uma chave criptográfica ou mesmo um arquivo. É um método para transformar dados de tal forma que o resultado seja (quase) exclusivo. Além disso, funções usadas em criptografia garantem que não é possível a partir de um valor de hash retornar à informação original.

Como a sequência do hash é limitada, muitas vezes não passando de 512 bits, existem colisões (sequências iguais para dados diferentes). Quanto maior for a dificuldade de se criar colisões intencionais, melhor é o algoritmo.

Fonte: Wikipedia

Algoritmos de hash

Atualmente existem diversos algoritmos de hash disponíveis. Veja eles aqui. Em nosso exemplo, focaremos nos mais usados pelo mercado:

  • MD2 (Message-Digest Algorithm);
  • MD5 (Message-Digest Algorithm 5);
  • SHA-1 (Secure Hash Algorithm);
  • SHA-256 (Secure Hash Algorithm 2 – 256 bits);
  • SHA-512 (Secure Hash Algorithm 2 – 512 bits);

Gerando hash usando Java “puro”

O Java possui a classe MessageDigest  para geração de hash. Veja abaixo como gerar os hashes.

Abaixo, comecemos com um exemplo usando o MD5.

Acima, nós geramos um hash a partir de uma String . Mas veja que o método md.digest()  somente aceita um array de bytes. Isso significa que podemos tirar hash de praticamente qualquer coisa. De strings a arquivos. Mas e os outros algoritmos? Como fazemos para tirar hash com eles? É muito simples. É só trocar o parâmetro do método MessageDigest.getInstance(); . Veja:

Você pode ver todos os algoritmos suportados aqui.

Mas agora temos um outro problema. O hash retorna como um array de bytes também. E se eu quiser ver esse array em forma de String (hexadecimal)? Para isso, temos que recorrer a uma função separada para gerar essa String hexadecimal para nós. Abaixo está o código.

Para Java é isso! Agora vamos ver como usar a biblioteca de utilitários commons-codec  da Apache para nos ajudar a gerar os mesmos hashs com um pouco menos de linhas de código.

Gerando hash usando o Commons-Codec

A biblioteca commons-codec é um biblioteca com diversas classes utilitários para trabalharmos com encoders e decoders como base64, hexadecimal, hashes e diversos outros. Ela é mantida para fundação Apache e está disponível sob licença Apache License 2.0.

Primeiro de tudo, adicione a dependência do commons-codec no seu projeto.

Maven

Gradle

Gerando os hashes

Vamos gerar o mesmo hash MD5 usando o commons-codec.

Bem mais simples não é mesmo? Para os outros algoritmos, seguimos a mesma linha.

Já para String, o commons-codec nos fornece o método para convertermos o array de bytes em String hexadecimal. Veja o exemplo abaixo como funciona o método Hex.encodeHexString(); 

Finalizando e obtendo mais códigos

Concluindo então que não é tão difícil gerar hashes com Java, tanto pela plataforma como usando a ajuda do commons-codec. Se você quer ver um pouco mais de código sobre hashes e criptografia, de uma olhada nesse meu repositório do github que estou evoluindo para posts sobre criptografia e hashs com Java. O código lá está mais completo, com testes em JUnit e engloba mais coisas não ditas aqui no post.

Referências

As duas maiores bibliotecas hoje usadas para ler e escrever JSON usando Java é sem dúvida nenhuma o Jackson e o GSON, do Google. Abaixo, há exemplos de código de ambas as bibliotecas de como escrever JSON a partir de objetos Java e como ler JSON e preencher os objetos Java.

Além disso, mostro como escrever direto para arquivo os JSON’s criados. Vamos aos exemplos que é mais fácil para aprendermos.

Dependências

As dependências para ambas as bibliotecas. Adicione no seu projeto:

Maven

Gradle

Os objetos a serem serializados

Abaixo são os objetos que iremos escrever em JSON e depois ler de volta e preenche-los. Não irei colocar todos os objetos pois estenderia muito o post. Irei colocar alguns exemplos, no entanto, você pode consultar todas as classes no repositório do deste exemplo aqui no github: https://github.com/blog-rgiaviti/json-serialization

Person.class

Job.class

Jackson: Serializando objetos Java para JSON

Agora vamos serializar os objetos Java para JSON usando o ObjectMapper  do Jackson. No exemplo abaixo, o JSON sairá printado no Console da aplicação.

Se quisermos que o Jackson salve o JSON direto para arquivo, bastaria chamar:

Jackson: Deserializando JSON para objetos Java

Agora vamos fazer o inverso que fizemos acima. Vamos ler um JSON e vamos preencher os objetos Java.

O Jackson vai muito, mas muito além disso. Consulte a página oficial deles no GitHub (postei lá na parte de cima do post) e também a documentação. Tem muita coisa, principalmente a parte de formatação e anotações de classes. Agora vamos partir para o exemplo do GSON.

GSON: Serializando objetos Java para JSON

O GSON é um pouco menos verboso que o Jackson na hora de gerar um JSON. Veja só:

Observe no código acima que há um trecho que eu já mostro como escrever para arquivo. No GSON não há nada meio “automático” igual no Jackson para escrever o JSON para arquivo. Temos que usar o bom e velho FileWriter  mesmo e mandar o JSON para o filesystem.

GSON: Deserializando JSON para objetos Java

E por fim, o processo de leitura do JSON e preenchimento dos objetos Java usando o GSON.

É isso aí. Consulte também a documentação do GSON e veja todos os recursos que ele oferece na manipulação de JSON’s. Vale a pena.

Códigos Fontes e Repositório

Logo do GitHub

Todos os códigos deste post está disponível no GitHub sob licença MIT. Acesse: https://github.com/blog-rgiaviti/json-serialization