19 de janeiro de 2020

Python que nem Javascript!

Disclaimer: Nunca faça isso na real!

Python tem uma natureza funcional muito boa (não tão boa quanto linguagens funcionais, é claro), o que de certo modo faz ele similar com Javascript, utilizando closures e afins. Inclusive permite construções similares a esta abaixo:

Python não define um meio de criar objetos dinâmicos como Javascript, devido a sua forte tipagem, por isso usei a estrutura de dicionário. O que acontece na verdade é que devolvemos uma coleção de funções que acessam os atributos do "construtor" através de closures.

Desde o ES6/ES2015 temos como declarar classes em Javascript utilizando keywords como class, constructor, etc, o que deixa bem mais limpo e agrupado, mas tudo isso ainda é syntax suggar para a estrutura de criação de objetos que existia anteriormente.

Update:


Consegui usar as chamadas de método normalmente, porém tive que definir uma classe apenas de quebra galho (a classe Object) apenas para poder usar setattr e para isto é necessário a classe definir __dict__:

10 de janeiro de 2020

Fazendo upload de arquivos para o Google Cloud Storage com Python

O processo é bem simples, porém é necessário antes configurar algumas coisas no Google Cloud e gerar as credenciais necessárias, para este processo pode seguir este tutorial. Lembre-se também de criar uma variável de ambiente com o nome GOOGLE_APPLICATION_CREDENTIALS apontando para o caminho do json, no Linux basta fazer:

export GOOGLE_APPLICATION_CREDENTIALS=/caminho/para/arquivo.json

Depois disso é possível executar o código abaixo (é claro, o bucket e o  arquivo indicado deve existir):


6 de janeiro de 2020

Pense sobre o seu trabalho - O programador pragmático

Os dias não são fáceis, você acorda cedo e se desloca para o seu trabalho, então você faz algumas coisas e chega o fim do dia, você faz o caminho inverso para sua casa. No fim do mês você é pago por isso, o que é bom, e se for da área de TI, é "mais bom" do que 90% do restante do Brasil.

Agora voltemos ao "faz algumas coisas" do paragrafo acima, que coisas são essas? Onde você aprendeu elas? Como lida com elas? Todas essas coisas são a sua profissão, mas o que é profissão? Será que é apenas o seu trabalho? Aquilo que você é pago para fazer? Vamos buscar a definição de profissão:

pro·fis·são
(latim professio-onisdeclaraçãomanifestaçãoprofissãoempregoestadoensino)

substantivo feminino
1. Declaração pública.

2. Solenidade na qual alguém se liga por votos a uma ordem religiosa.

3. Ofícioempregoocupaçãomister.

"profissões", in Dicionário Priberam da Língua Portuguesa [em linha], 2008-2020, https://dicionario.priberam.org/profiss%C3%B5es [consultado em 05-01-2020].

Como podemos ver acima, profissão vem do latim professio e significa declaração, manifestação, então a sua profissão é a sua declaração para o mundo, seu ofício. Isso deixou as coisas um pouco mais profundas do que apenas "aquilo que faço para ganhar dinheiro". Inclusive não há na definição acima (pelo menos na etimologia da palavra) algo que ligue profissão a dinheiro, logo podemos ser profissionais sem ser remunerados (e também podemos ser amadores remunerados!).

Assumindo essa nova visão mais profunda sobre a sua profissão, você gasta um pouco do seu tempo diário pensando no que você está declarando para o mundo através do seu trabalho? Você pensa em como fazer algo com qualidade, que agregue valor real para o mundo? Fazendo essa reflexão para a nossa área, a programação, fica claro que não faz parte da nossa rotina trazer essa reflexão para o nosso dia a dia (e isso está longe de ser ensinado em nossas escolas, mas isso é assunto para outro momento).

As nossas responsabilidades como programadores são cada vez maiores, pois em um mundo onde a automação toma cada vez mais espaço, passamos de pessoas que criavam e geravam simples sistemas de cadastro e, quando muito, folhas de pagamento, para mantenedores de sistemas que movimentam milhões por semana, sistemas hospitalares (não só a ficha do paciente, mas também todo o suporte a vida de algumas UTIs) e a programação no mundo real através de robôs, carros autonômos, aviões e muito mais. Então precisamos fazer bem tudo isso, fazer nosso trabalho com qualidade, precisamos pensar sobre o que estamos fazendo, não apenas fazer. É necessário gastar um tempo pensando antes de qualquer decisão, se aquilo é a melhor forma de fazer, se irá ajudar as pessoas que prometemos ajudar e principalmente, se não irá prejudicar as pessoas que prometemos ajudar, tudo isso converge para um aspecto muito importante, a qualidade das nossas criações.

A qualidade de tudo o que fazemos está altamente correlacionada em como dominamos os meios pelo quais nos expressamos, da mesma forma que um marceneiro que usa com maestria suas ferramentas e cria coisas incríveis, um desenvolvedor que domina o computador com maestria também cria coisas incríveis, afinal a ferramenta para o artesão é como uma extensão para a sua mão e quando você quer fazer algo com a sua mão você não precisa pensar em quanto deve rotacionar seu pulso, a pressão que deve colocar nos dedos, etc., você só pensa no que deve ser feito e faz.

Parece ser muita responsabilidade e, pra falar a verdade, é. É necessário um esforço em forma de treino e prática a mais na sua rotina para que você domine essas ferramentas, seu computador, o servidor onde você roda suas aplicações, porém tudo isso vem com a sensação de que você está realmente no controle do que acontece, no controle da qualidade e principalmente no controle da sua carreira, que é parte essêncial da sua vida. E é claro, quando você tiver um domínio alto de todas as suas ferramentas e sua carreira, tudo isso para de ser uma barreira e permite você focar na sua parte criativa, participar de outras decisões (como de negócios) e também, quem sabe, se divertir mais com o seu trabalho.

Essas são algumas reflexões que tirei do inicio da segunda ediçao do livro O Programador Pragmático, que já comentei em outro post.


30 de dezembro de 2019

O caminho do programador (pragmático) - Um pouco sobre a primeira edição do Programador Pragmático

Disclaimer: Este post é o primeiro de uma série sobre o livro O Programador Pragmático, tratando sobre a primeira edição, caso deseje compra-lo dá uma conferida no último parágrafo (o que já irá acontecer se você ler o post inteiro).

Durante nossas carreiras existem alguns momentos enigmáticos que nos fazem refletir sobre o que realmente queremos para o nosso futuro, sobre o profissional que queremos ser e como iremos nos portar pelos próximos anos. Tais momentos são motivados por diversos fatores, como um perrengue no trabalho, um professor que sabe te direcionar, a comunidade, ou como é no caso, um livro.

No ano de 2011 iniciei a minha jornada profissional como programador, já havia lido alguns títulos técnicos, mas estava longe de ser o que consideramos um bom profissional. Havia muito o que aprender para poder ter mais autonomia e confiança, tanto tecnicamente como comportamentalmente. Durante minhas perambulações pela livraria Cultura do Conjunto Nacional passei pela área de informática e esbarrei em um livro interessante, O Programador Pragmático de Andrew Hunt e David Thomas.
Folheando vi diversos temas que esbarram no técnico, mas tinham uma visão mais geral, trazendo uma lista de competências que nós, programadores, deveríamos desenvolver para sermos profissionais mais pragmáticos.

O livro é bem direto em seus pontos, abordando assuntos diversos e algumas novidades para um jovem programador que já em 2011 não sabia o que estudar devido a enxurrada de informação da época (e olha que a onda do novo framework de Javascript por segundo ainda estava por vir). A estrutura do livro é em capítulos-tópicos, curtos e bem objetivos. Os temas são variados, passam pelo teste unitário e sua importância, como estruturar o código e princípios de boa engenharia de software, ferramentas que devemos dominar e chegando no ponto sobre gestão de projetos ágeis (tanto o Andrew quando o David são signatários do Manifesto Ágil)

Ele realmente me impactou no que diz respeito sobre o que é um software de qualidade e principalmente a qualidade de um profissional de programação. A abertura para assuntos que eu nunca tinha visto antes, como expressões regulares, testes unitários, manipulação de textos e domínio da linha de comando já fez a minha cabeça abrir para diversos assuntos, fazendo eu ter que lidar com linguagens antigas porém muito poderosas em suas premissas (a edição brasileira é de 2010, mas na verdade o livro data de 1999) como Smalltalk e Perl.

Confesso que li mais rápido do que deveria, pois este não é um livro que você simplesmente passa por suas páginas e tem uma fácil absorção, principalmente se você for tão amador quanto eu era na época. Ele propõe diversas ideias com muitos exemplos e não deixa passar em branco seu aprendizado no final dos capítulos, propondo exercícios e reflexões sobre problemas e casos relacionados ao tema. Revisitei o livro diversas vezes durante os anos seguintes e sempre aprendia algo novo, fazendo seus exemplos, levando para o meu trabalho diário o que estava aprendendo dele.

Não caberia neste post falar sobre todos os tópicos do livro e logo iniciarei uma jornada mais detalhada pelos capítulos da segunda edição lançada este ano, sendo assim vou deixar para uma resenha mais completa passar por tais tópicos. Novos tópicos foram adicionados na segunda edição (como uma seção inteira sobre concorrência e seus modelos), além de outros que foram encolhidos ou removidos (como geração de código pois com o avanço das abstrações em linguagens de programação não se fazem necessárias na mesma escala de outrora).

Caso queira adquirir o livro recomendo começar realmente pela segunda edição, mas caso não consiga vale ler a primeira edição emprestada ou quem sabe procurá-la em sebos, pois mesmo com linguagens e algumas tecnologias antigas, seus conceitos ainda são muito sólidos e valiósos.


17 de março de 2019

Utilzando Celery junto com o SQS

Uma das formas de lidar com processamento assíncrono no Python (e diversas outras linguagens) sem a necessidade de usar threads e afins é utilizando filas e tasks (que são aplicações que rodam conforme demanda, em um processamento similar a batches).

Para isto o Python dispõe de uma biblioteca chamada Celery, que de uma maneira bem simples permite realizar o processamento assíncrono. Explicando de uma maneira simples, ao invocar uma função, ao invés de executar seu código, o Celery pega os parâmetros e mais algumas metainformações da chamada e coloca numa fila, enquanto isso, em outro lugar (processo, computador ou continente), o Celery captura as mensagens desta fila e dispara as tasks. Aqui está uma implementação básica de uma task que soma dois valores:


Primeiro criamos a instância app Celery e dizemos qual módulo está a configuração. Perceba que a função foi anotada com o decorator @app.task(queue='test-celery), que já faz a função ser gerenciada pelo Celery, o parâmetro queue serve para indicar qual a fila que deverá ser utilizada para isto.

A configuração também é simples:


Nele configuramos o broker_url (com ID e secret do usuário com acesso programático ao SQS), que indica qual broker (gestor de fila) utilizaremos (no nosso exemplo usamos o SQS, porém o Celery dá melhor suporte e com mais funcionalidades no RabbitMQ e Redis). Também configuramos as filas que utilizaremos em task_queues, senão será usada a fila padrão (celery). 

Após isso podemos executar o Celery:

celery -A tasks worker --loglevel=info

E assim podemos invocar a função (em outro terminal ou até mesmo em outro computador com o mesmo projeto), porém chamamos ela através do método .delay(parâmetros):

Assim a função será invocada através do Celery.

Caso queira baixar este código de uma vez só e instalar suas dependências, confira aqui no Github.

Obs: O CacheLock que você viu ajuda a não ter a possibilidade uma mesma mensagem ser consumida por duas tasks ao mesmo tempo.

24 de fevereiro de 2019

Usando terminal e programando em Python no Android


O terminal é uma das ferramentas mais poderosas que temos ao manipular informações no computador, desde o desenvolvimento de software até o hacking, passando por manipulação de texto, administração de sistemas e também para algumas brincadeiras. O acesso ao terminal é simples quando você está dentro de um Linux no computador (e até no Windows agora), porém nem sempre temos um notebook por perto, que por mais que seja portátil, não é simples de carregar por ai. Então, nas pesquisas pela internet, buscando uma alternativa para o tablet e smartphone, eu encontrei o Termux.

O Termux emula um terminal dentro do seu Android, porém ao contrário de alguns aplicativo que apenas emulam alguns comandos, ele tem um sistema completo de terminal, ainda permitindo instalar pacotes de maneira similar ao Debian:

Instalando um pacote do sistema com o comando apk install

Aproveitando todo esse poder, também instalei o Python 3.7.2 e diversas dependências de bibliotecas de sistema (openssl-dev, libffi-dev e etc) junto com o Git e clonei um projeto do Github. A aplicação funcionou normalmente, sendo um bot para Telegram que faz scrap da API do Reddit, usando as libs telegram-bot, requests e click, além de outras dependências como pytest, pytest-cov e muito mais. Você pode conferir o projeto aqui.

Rodando os testes junto com a cobertura

Uma das limitações que percebi no Termux, que na verdade é uma limitação do Android, é que como ele não permite a criação de links simbólicos no sistema e a definição de executáveis (o que acredito que ser fácil de superar quando o aparelho está "rooteado"), você não pode criar virtualenv's dentro do sistema, o que pode ser facilmente ser superado pelo fato de você criar suas virtualenv's na home do Termux.