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.