quarta-feira, 18 de outubro de 2017

Módulos em Java 9

Em 2017 saiu a versão nova do Java - o Java 9. Com esta versão sai um novo sistema de módulos chamado Jigsaw. Os módulos do Java 9 são uma das maiores mudanças na estrutura do java.
Um Módulo é uma coleção auto-descritiva de Código, Dados e Recursos. Um módulo é um conjunto de Pacotes, Tipos (classes, classes abstratas, interfaces, etc.) com Código e Dados e Recursos.

As aplicações escritas em Java 8 ou anteriores não conhecem suas próprias dependências.
Claro que o javac não compilará nosso código se faltarem dependências de tempo de compilação e, claro, temos ferramentas de compilação e IDEs para nos apoiar com esses casos. Contudo, no tempo de execução, a JVM precisa pesquisar classes necessárias no CLASSPTH novamente, em alguns casos, resultando em diferentes classes sendo carregadas pelo classloader. Assim podemos ter problemas em tempo de execução.
A estrutura modular vem para resolver este problema.
Além disto o sistema JDK atual é muito grande. No Java 9, o próprio JDK foi dividido em pequenos módulos. Portanto, é muito fácil reduzir o aplicativo Java para dispositivos pequenos.


O JDK 9 não contém JRE. No JDK 9, o JRE é separado em uma pasta de distribuição separada. O software JDK 9 contém uma nova pasta "jmods", que contém um conjunto de módulos Java 9 como mostrado abaixo.

No Youtube estão 3 vídeos que trazem uma introdução a este tema.






quarta-feira, 7 de junho de 2017

Tratando CTRL-C em python

Quando pressionamos CTRL-C no teclado e nosso programa está rodando, normalmente isto significa que o programa deverá parar. Quando pressionamos CTRL-C é gerado um sinal para o programa.
Um sinal é uma forma de comunicação entre processos utilizada nos sistemas operacionais compatíveis com POSIX. Um sinal é uma notificação assíncrona enviada para um processo ou para um segmento específico dentro do mesmo processo para notificá-lo de um evento que ocorreu.

Quando um sinal é enviado, o sistema operacional interrompe o fluxo normal de execução do processo alvo para entregar o sinal. A execução pode ser interrompida durante qualquer instrução não atômica. Se o processo já registrou um manipulador de sinal, essa rotina é executada. Caso contrário, o manipulador de sinal padrão é executado.

O python permite que troquemos como os sinais serão tratados, assim dá para capturar o envio do CTRL-C e executar um procedimento de tratamento personalizado. Abaixo a gente pode observar um exemplo de como fazer este tratamento de sinal.
Precisamos importar a biblioteca SIGNAL do Python.
Utilizamos na linha 23 o comando para atribuir uma função de tratamento signal_handler() para o sinal CTRL-C (SIGINT). Nas linhas 11 a 17 criamos o nosso tratador signal_handler().
Note que ele recebe dois parâmetros, o número do sinal (pois a gente pode usar a mesma função para tratar vários sinais) e os dados da pilha.



Você pode obter este módulo em meu repositório python_codes no github.

Referências

Quer saber com mais detalhes como este processo de sinalização ocorre no sistema operacional?
Leia a seção 4.6.2 sobre manipulação de sinais do livro do Silberschatz.
Se quiser ler mais sobre a manipulação de sinais no Pythom, veja em python docs.

sexta-feira, 14 de abril de 2017

Rodando Docker sem sudo

Quando instalamos o docker, o nosso usuário não fica automaticamente habilitado para rodar o docker sem utilização do comando sudo. Isto acontece porque o daemon do docker sempre é executado como o usuário root. Desde docker versão 0.5.2, o daemon docker se liga a um socket Unix em vez de uma porta TCP. Por padrão, esse socket Unix é propriedade da usuário root e, portanto, por padrão, você pode acessá-lo com o sudo. Se você tentar rodar terá o seguinte erro:


A partir da versão 0.5.3, se você criar um grupo Unix chamado docker e adicionar usuários a ele, então o daemon do docker fará com que o grupo tenha acesso de leitura e escrita neste socket Unix quando o daemon for iniciado .

O daemon do docker deve sempre ser executado como o usuário root, mas se você executar o cliente docker como um usuário no grupo do docker, então você não precisa adicionar o sudo a todos os comandos do cliente.

Então como fazer para rodar. Os passos são:

  1. adicionar o grupo docker, caso ele ainda não exista (no meu caso ele já existe)
  2. adicionar o seu usuário (e qualquer outro que você queira) ao grupo do docker
  3. reiniciar o daemon: no meu caso o processo chama docker, mas em algumas versões de SO o nome é docker.io.


Você precisa carregar nas configurações de seu usuário o novo grupo. Você pode: (1) fazer log out e entrar novamente ou (2) usar o comando "newgrp docker" para carregar estas configurações. No meu exemplo abaixo eu usei a segunda opção. Com isto agora meu usuário consegue carregar o hello-world sem utilizar o sudo.


quarta-feira, 1 de março de 2017

Docker e Java

Normalmente eu preciso utilizar o java. Meu sistema operacional preferido é o Ubuntu, mas na Universidade o sistema operacional apesar de ser linux, não é o Ubuntu. A utilização do Docker é ideal neste caso, pois posso utilizar meu ambiente favorito, não necessário um ambiente de virtualização na estação que estou utilizando, bastando ter o docker instalado e meu usuário no grupo docker.

Um jeito de automatizar o processo é utilizar um dockerfile e criar um docker local usando o comando docker build. Se você quiser ter mais informações leia a documentação no site do docker em https://docs.docker.com/engine/reference/builder/.

Vamos então a instalação e criação de um docker com java 9.
São dois passos:

  1. Instale o docker no seu computador
  2. Rode o comando docker build github.com/h3dema/ubuntu_java
Vá tomar um café pois demora um pouco. Será feito o download do programa e seu docker será criado.

Pronto!



PS: Hoje (29/05/2017) este procedimento não está funcionando mais. A Oracle retirou do ar o site java.net que era onde era baixado o JDK. Assim que o pessoal do webupd8 atualizar o script, eu indico aqui também.


terça-feira, 3 de janeiro de 2017

Java 9 terminou os testes de unidade

O Java 9 está começando a sair do forno. Agora em dezembro o desenvolvimento alcançou a marca de "Recurso Completo", ou seja, todos os recursos foram implementados e integrados na floresta principal do Java, inclusive sendo feitos os testes de unidade.
A lista de recursos do JDK 9 incluídos no JDK 9 Early Access Downloads pode ser encontrada na página do Projeto JDK 9.

Para instalação no Ubuntu (funciona em outras variantes do Debian também) basta seguir os passos em um terminal:

$ sudo add-apt-repository ppa:webupd8team/java
$ sudo apt-get update
$ sudo apt-get install oracle-java9-installer

Se você quiser configurar o Oracle Java 9 como padrão, não importa quais outras versões Java estejam instaladas, certifique-se de instalar o pacote oracle-java9-set-default, digitando no terminal:

$sudo apt-get install oracle-java9-set-default

Note que ainda é um release recente para testes.
Não deve ser utilizado hoje em um ambiente de produção!

Alterando o local padrão para as máquinas virtuais no VMware Player

Eu uso muito os ambientes de virtualização da VMware, Xen e Virtualbox.
Na versão gratuita do VMware, chamada VMware Player, você pode criar diversas máquinas virtuais para uso não comercial. Uma das maiores dificuldades que tive é em organizar onde as máquinas serão criadas. Eu normalmente coloco todas em um subdiretório assim fica fácil fazer backup delas.

Na GUI do VMware Player não existe uma opção para definir onde é a localização default das VMs.
Se você está utilizando linux, procure dentro do HOME do seu usuário o diretório .vmware (note que começa com ponto). Abra o arquivo ~/.vmware/preferences e acrescente a seguinte linha:

prefvmx.defaultvmpath = /<seu diretório>

Salve o arquivo, reinicie o VMware Player. Pronto, agora quando você for criar uma nova VM você será direcionado para o diretório que você definiu.

No Windows é necessário acrescentar a mesma linha, contudo o caminho completo do arquivo de preferências é: %Appdata%\VMware\preferences.ini.