Arquivo do autor:paulo

Trocando a versão do Python no macOS

Olá,

Ao instalar o macOS ele traz diversas linguagens e seus interpretadores já pré-instalados. Ele traz o Python, o PHP, o Ruby, entre outros.

Mas talvez você tenha tido o mesmo problema que eu. Eu precisava fazer com que os comandos que eu tenho que chamam o Python, passassem a chamar uma outra versão do Python, sem que eu tivesse que mudar todos os meus scripts. Seria fácil fazer um alias ou mudar os scripts para python2 ou python3, mas essa com certeza não era pra mim a melhor solução.

A primeira coisa que fiz foi instalar as versões que eu queria. Então usei o Brew para me ajudar com isso. Instalei rapidamente o Python 2 e 3 atualizados com os comandos no Terminal:

brew install python
brew install python3

Caso você queira saber se está funcionando digite:

python2 --version
python3 --version

O Terminal deverá exibir as versões após a execução das linhas acima.

Após isso ainda não fizemos nada, apenas deixamos instaladas as versões que queremos.

É totalmente desaconselhável remover a versão que já vem no macOS, isso deve quebrar algumas coisas que dependem disso.

A primeira coisa a se fazer é definir a ordem de como o sistema irá procurar o comando “python” no macOS. Para isso edite o arquivo com o nano, assim:

sudo nano /etc/paths

E verifique se a primeira linha do arquivo está como:

/usr/local/bin

Caso não esteja, remova ela de onde estiver e coloque na primeira linha do arquivo.

Isso fará com que os “binários” sejam procurados primeiramente na pasta “/usr/local/bin“, dando preferência aos “binários” e links simbólicos dentro desta pasta.

Agora tudo o que precisamos fazer é criar um link simbólico dentro de “/usr/local/bin” que tenha o nome “python” e aponte para a nossa versão do Python que queremos (2 ou 3, depende da sua necessidade).

Para isso execute a seguinte linha para o Python 2:

ln -s /usr/local/bin/python2 /usr/local/bin/python

E para o Python 3 digite no terminal:

ln -s /usr/local/bin/python3 /usr/local/bin/python

Caso você já tenha criado anteriormente algum link simbólico e deseja trocar, apague o link simbólico atual com a seguinte linha:

rm -f /usr/local/bin/python

Não precisa executar estas linhas como root/sudo, pois seu usuário já tem acesso a ela.

Caso você queira atualizar o Python, basta executar o Brew com o parâmetro upgrade, assim:

brew upgrade python
brew upgrade python3

Ao terminar tudo, reinicie seu terminal para que as alterações façam efeito.

 

Obrigado e até o próximo post pessoal.

Correção para abrir uma aplicação supostamente corrompida no Mac

Olá,

As vezes ao baixar alguma aplicação fora da App Store no Mac/OSX você recebe uma mensagem de aplicação corrompida, que na verdade é uma proteção do sistema operacional para não executar aplicações que não sejam “seguras” para o usuário, ou aplicações que não foram baixadas de uma fonte segura.

Existe uma forma de burlar isso bem fácil. Abra o terminal e digite:

sudo spctl --master-disable

Isso desabilitará a proteção. Então agora basta você executar a mesma aplicação e ela funcionará. Após rodar a aplicação, habilite novamente a proteção com o comando no seu terminal:

sudo spctl --master-enable

Obs: Lembre-se que você só deve fazer isso se realmente tiver certeza de que a aplicação é confiável, caso contrário não faça.

Obrigado e até o próximo post pessoal.

 

Docker – Post Install – O que fazer depois de instalar?

Olá,

Recentemente tive alguns problemas com o Docker relacionados não com ele, mas com os logs gerados por ele e o espaço em disco disponível que eu tinha em uma instância na AWS.

Após muito varrer o disco em busca dos dados que mais ocupavam espaço, vi que os logs estavam crescendo exponencialmente e decidi usar o logrotate, um utilitário pro Linux para rotacionar os logs quando estes atingem as regras que você define em um arquivo de configuração.

Para instalar o logrotate, execute:

sudo apt-get update
sudo apt-get install logrotate

Após instalar execute “logrotate” para saber se está instalado corretamente.

Após instalar, precisamos configurar uma regra no logrotate para os logs do Docker. Então execute:

nano /etc/logrotate.d/docker-container

Obs: Eu usei o “nano”, mas você pode usar o “vi” ou “vim” se preferir. Dentro do editor, cole a seguinte regra para o logrotate:

/var/lib/docker/containers/*/*.log {
  rotate 7
  daily
  compress
  size=1M
  missingok
  delaycompress
  copytruncate
}

Salve o arquivo, feche o editor e pronto, logrotate configurado.

No meu caso, eu deixei os arquivos de log com no máximo 1M de tamanho, mas você poderá aumentar para quanto quiser.

Caso você queria testar o logrotate e ver o que ele vai fazer, execute o comando:

logrotate -df /etc/logrotate.d/docker-container

 

Obs: Além disso, mesmo configurando, havia um arquivo que parece ter corrompido e depois de muito pesquisar eu acabei tendo que apagar este arquivo, pois estava impedindo o logrotate de executar, já que ele parece usar este arquivo como referência para alguma coisa. Então, caso aconteça contigo, apague o arquivo “status” na pasta do logrotate com o comando:

rm /var/lib/logrotate/status

 

Bom, é isso pessoal. Espero que isso ajude a economizar espaço com os logs gerados pelo Docker. É claro que isto não se aplica só ao Docker, você pode criar regras para qualquer arquivo, basta especificar o pattern para os arquivos e colocar as regras.

Ah, e no meu caso o espaço utilizado foi de 76% para 34% do disco, ou seja, 42% do disco era log do Docker.

Obrigado e até o próximo post pessoal.

SentryCar – Sistema de rastreamento e bloqueio veicular

Olá,

Recentemente desenvolvi todo um sistema de rastreamento e bloqueio de veículos, chamado de SentryCar.

O projeto consiste em uma aplicação mobile ou web que pode ser acessada por um cliente/usuário para rastrear um ou vários veículos, monitorar sua localização e velocidade, além de bloquear e desbloquear o carro, cortando a fonte de combustível quando ele atinge 20Km/H ou menos.

O sistema é dividido em 6 partes:

  • Apps (iOS e Android).
  • Web (mesmo sistema acessado pelos apps e pagamento da mensalidade).
  • Servidor (servidor desenvolvido em Go para receber conexões TCP/IP dos rastreadores e coletar os dados necessários).
  • Banco de dados MySql.
  • Rastreadores importados do AliExpress e interpretação do protocolo definido pelo fabricante.
  • API que permite qualquer device via HTTP/TCP enviar sua posição, desde que esteja cadastrado no sistema. Tanto os aplicativos, como o sistema web e o rastreador, utilizam a mesma API.

 

Eu precisei fazer uns vídeos para que a Apple aprovasse meu app, então fiz alguns vídeos demos e coloquei em minha conta do Youtube:

  • https://www.youtube.com/watch?v=pKCQLeSOvdg
  • https://www.youtube.com/watch?v=0RsqSgQETRc

 

URL para demonstração:

  • http://sentrycar.prsolucoes.com

 

Caso alguém precise desenvolver algo do tipo, podemos fazer uma parceria.

 

Obrigado e até o próximo post pessoal.

Limpando os dados do Docker em sua máquina (containers e imagens)

Olá,

Quem utiliza Docker no dia-a-dia sabe que ele deixa muitos lixos na máquina em que está rodando, principalmente se você fica criando containers de teste como eu.

Quando você sai do container o Docker não apaga eles automaticamente, o que vai enchendo o disco e você acaba recebendo o erro: No space left on device.

Como eu passo por isso sempre, resolvi fazer uma sequência de comandos para copiar e colar no terminal, a fim de que o ambiente fique limpo denovo.

docker rm -v $(docker ps -a -q -f status=exited)
docker rmi $(docker images -f "dangling=true" -q)
docker volume rm $(docker volume ls -qf dangling=true)

 

Espero ter ajudado com este artigo.

Obrigado e até o próximo post pessoal.

 

Usando o auto-update do Fastlane

Olá pessoal,

Recentemente tivemos um necessidade de fazer com que o Fastlane (ferramenta para deploy contínuo – http://fastlane.io/) fizesse a atualização de suas dependências automaticamente, isso inclui todos esses caras:

cert, credentials_manager, deliver, fastlane, fastlane_core, frameit, gym, match, pem, pilot, produce, scan, screengrab, sigh, snapshot, spaceship, supply

Toda vez que vamos usar o Fastlane para subir as aplicações tem atualizações novas de suas dependências e que muitas das vezes gera algum erro no envio e não conseguimos subir os aplicativos até que atualizemos manualmente as dependências necessárias com o comando “gem update …” e depois começamos o processo novamente de deploy.

Isso é bem chato, então a primeira coisa que pensei foi em adicionar o “gem update” em nossa ferramenta de integração contínua, GoCI (http://github.com/prsolucoes/goci), antes de fazer as chamadas ao Fastlane.

A segunda opção era buscar na documentação para saber se existe alguma coisa pronta para este problema, e foi ai que achei o comando “update_fastlane”. Após olhar a documentação e realizar alguns testes, resolvi escrever o passo-a-passo para implementar isso. Vamos à prática:

  1. Adicione no início do seu arquivo Fastfile, antes de qualquer coisa, esta linha:

    update_fastlane

  2. Adicione as seguintes linhas ao seu arquivo “.bash_profile” ou “.bashrc”, que fica na pasta do seu usuário, ex (nano ~/.bash_profile):

    export GEM_HOME=~/.gems
    export GEM_SPEC_CACHE=$GEM_HOME/specs
    export PATH=$PATH:~/.gems/bin

  3. Execute o arquivo modificado com o comando “source”, ex:

    source ~/.bash_profile

  4. Atualize o rubygems e o gem:

    gem install rubygems-update
    sudo gem update –system

  5. Instale suas gems novamente, as que você usa. No meu caso era o fastlane e cocoapods, então fiz assim:

    gem install cocoapods fastlane –no-ri –no-rdoc

Com tudo isso feito, você já preparou o seu ambiente e atualizou tudo o que é necessário para que o auto-update do fastlane funcione. Agora basta você executar suas tarefas do fastlane que ele vai executar o auto-update antes de tudo.

Obs: Nós definimos uma novo diretório para as “gems” do ruby porque sem isso o fastlane irá reclamar que a pasta de “gems” é do usuário root (sendo necessário fazer um sudo + comand) e não sua.

 

Espero ter ajudado com este artigo.

Obrigado e até o próximo post pessoal.

Instalando drivers não assinados (unsigned) no Mac/OSX

Olá,

Recentemente precisamos instalar o driver de um adaptador de Rede Ethernet RJ45 no Mac (Plugable USB 3.0 to 10/100/1000 Gigabit Ethernet LAN Network Adapte – Chiptset LAN7500) e o adaptador não ligava e não funcionava de jeito algum.

Porém ao tentar carregar o driver via terminal aparecia a mensagem:

/System/Library/Extensions/LAN7500.kext failed to load – (libkern/kext) not loadable (reason unspecified); check the system/kernel logs for errors or try kextutil(8).

O problema está na verdade não com o driver, mas com o sistema que é o Sierra. Parece que depois de alguma versão El Captain ou Yosemite a Apple passou a aplicar um sistema de segurança nos drivers que só pode ser desabilitado em modo de recuperação.

Então para fazer o driver funcionar e verificar se você possui o mesmo problema, faça o seguinte:

sudo kextload /System/Library/Extensions/LAN7500.kext

Substitua “LAN7500.kext” pelo nome do seu driver. Se ao executar você receber a mensagem abaixo, então você está com o mesmo problema:

/System/Library/Extensions/LAN7500.kext failed to load – (libkern/kext) not loadable (reason unspecified); check the system/kernel logs for errors or try kextutil(8).

Agora reinicie seu Mac segurando as teclas CMD + R. O sistema iniciará em modo de recuperação. Acesse o menu “Utilitários > Terminal” e digite:

csrutil disable

Ele vai informar que você precisa reiniciar, então digite agora:

reboot

Ao reiniciar seu Mac, o driver já será carregado e tudo funcionará.

 

Adaptador rede Mac OSX

 

Espero ter ajudado com este artigo.

Obrigado e até o próximo post pessoal.

Golang – GoDiffExporter – Exporte seus DIFFs com este utilitário

Olá,

Recentemente precisei compartilhar o resultado de um DIFF (git diff) para uma outra pessoa fazer a conferência e com isso eu precisava passar o acesso ao bitbucket e o link do commit específico para a conferência.

Isso me gerava um certo trabalho que eu não gostaria de ter toda vez que precisasse fazer isso, foi ai que pensei então no GoDiffExporter, um exportador em PDF de um arquivo DIFF qualquer.

Basicamente o parser do DIFF é feito e depois eu itero nas diferenças e crio o PDF, usando a lib GoFPDF, que inclusive colaborei recentemente adicionando o suporte a fontes embarcadas através de um array de bytes que vai dentro da sua própria aplicação, removendo a necessidade de distribuir as fontes em si (https://github.com/jung-kurt/gofpdf/pull/79).

O resultado do GoDiffExplorer é um PDF como este:

 

O projeto e as instruções de como instalar e usar estão na página do projeto:

https://github.com/prsolucoes/godiffexporter

 

Espero ter ajudado com este artigo.

Obrigado e até o próximo post pessoal.

Android – Debug de aplicação via WiFi usando ADB sem precisar de root

Olá,

Recentemente tive a necessidade de rodar a aplicação pelo Android Studio sem usar cabo, por questões de comodidade mesmo, e após pesquisar e fazer vários testes, preparei um tutorial sem simples.

  1. Desconectar o seu dispositivo do computador, caso esteja.
  2. Conectar o seu computador de desenvolvimento e o seu dispositivo Android na mesma rede WiFi.
  3. Habilitar o modo desenvolvedor em seu dispositivo (Configurações > Sobre > Apertar 7 vezes em Número da versão).
  4. Habilitar a depuração USB (Configurações > Programador > Depuração USB).
  5. Obtenha o IP do seu dispositivo em Configurações > Sobre > Status > Endereço IP.
  6. Abrir o terminal e executar (troque o IP abaixo pelo IP do seu dispositivo):
    adb tcpip 5555
    adb connect 192.168.0.103:5555
  7. Rodar a aplicação no Android Studio normalmente e se tudo deu certo seu dispositivo aparecerá na lista de devices como se estivesse conectado via cabo.

 

Espero ter ajudado com este artigo.

Obrigado e até o próximo post pessoal.