Automação 1

Automação 1

Como falei num post anterior, automatizar1 tem benefícios, principalmente se estivermos a falar para pessoas que já sabem programar e que por isso não têm que passar pela aprendizagem do que pode ou não ser automatizado (apesar de que normalmente a resposta é: tudo).

De todas as linguagens que podíamos usar para este tipo de tarefa, a minha preferida (e reparem que não disse a melhor, porque isso não existe) é Python2. Porquê?

  • É dinamicamente tipada. Ou seja, uma mesma variável pode ter mais do que um tipo durante o seu ciclo de vida. Era uma string e passou a ser um inteiro? Paciência, vive com isso, porque o compilador não se vai queixar. Sacrifica verificação da validade do programa em benifício do tempo de escrita, o que para scripts me parece um bom tradeoff. Se começas a sentir-te perdido pela falta de tipos provavelmente o teu programa cresceu demais, por isso lembra-te:

UNIX philosophy

  • É fácil de aprender, não só por ser bastante alto nível e expressiva, ou pela sintaxe simples, mas também pelas biblitoecas de interface intuitiva. Queres ler um ficheiro de texto com nomes de alunos de duas cadeiras e imprimi-los no formato certo sem duplicados?

print [name.capitalize() for name in set(input()) ^ set(input())]

  • Bibliotecas para tudo e mais alguma coisa! Manipulação de imagem (pillow), vídeo (moviepy, que serve como camada superior ao ffmpeg), HTTP (requests ou Mechanize, que “emula” um browser até certo ponto), extração de informação de páginas HTML (BeautifulSoup) ou compressão (zipfile). Como navegar numa estrutura de diretórios e rodar todos os PNGs 45º?

[PIL.Image.open(file).rotate(45).save() for file in glob.glob('/target/**/**/*.png')]

Tudo isto pode, e deve, ser usado para melhoria constante dos processos internos das empresas (ou pessoais, se forem como o administrador de sistemas que tirava cafés por SSH).

Há uma tarefa rotineria que a equipa de design tem que fazer, como renomear os ficheiros exportados pelo Photoshop, centrar imagens verticalmente e depois comprimir tudo? Python.

A malta de gestão todos os dias verifica se as taxas de câmbio estão dentro de um certo limite do que está definido? Python. Exemplo:

import mechanize
import bs4

def get_price(url, country = None):
    browser = mechanize.Browser()
    if country: browser.open("%s/change_country/%s" % (url, country))
    page = browser.open(url)
    response = bs4.BeautifulSoup(page.read(), "html.parser")
    meta_tag = response.find("meta", attrs={"property":"og:price:amount"})
    price = float(meta_tag["content"].replace(",", "."))
    return price

def get_rate(url, country = "PT"):
    base_price = get__price(url)
    rated_price = get_price(url, country=country)
    return rated_price / base_price

if __name__ == "__main__":
    if len(sys.argv) == 2:
        delta = float(sys.argv[1])
    else:
        delta = 0.05

    if abs(get_rate(our_url) - get_rate(authority_url)) > delta:
        print("aye")
    else:
        print("ney")

E há muitos outros exemplos.

automate all the things

Em termos de Software Engineering propriamente dito, este conceito está na origem do movimento de DevOps, que tenta aplicar esta coisas ao ciclo de desenvolvimento de software até chegar a um ponto de continuous deployment, em que cada entrada de código nova no repositório faz com que uma série de scripts de automação (testes, análise estática, deployment, …) sejam executados. Podem perguntar mais sobre isto ao Carlos Teixeira, que está a fazer uma tese em “Towards DevOps Practices and Patterns from the Portuguese Startup Scene”.

  1. automatizar ~= scripting

  2. Há várias implementações da linguagem e para todos os gostos: CPython (a implementação de referência), PyPy (inclui um compilador JIT para melhorias na performance em runtime), Jython (JVM) ou IronPython (.NET). Num contexto de automação, sempre que falar em Python, estou-me a referir a CPython. A vantagem em relação a outras implementações é ter um tempo de startup geralmente mais curto e vir instalado por defeito na maioria das distribuições Linux (por exemplo, o Ubuntu depende bastante da linguagem).

comments powered by Disqus