domingo, 24 de fevereiro de 2013

Utilitário: Monitor and Run

Olá pessoal,

Escrevi um pequeno programa em Python chamado monrun para resolver um pequeno probleminha meu e resolvi compartilhar.

Para que serve?

É a pergunta que não cala. Ele serve para executar um comando toda vez que um arquivo foi modificado, simplesmente.

E para que eu quero isso?

Bom, a utilidade depende da pessoa. Para mim, pessoalmente, eu às vezes utilizo LaTeX para escrever textos mais profissionais.

No uso do LaTeX é preciso, para ver o resultado do texto formatado, fazer a compilação para gerar PDF e eu acho chato ter que ficar alternando a minha janela o tempo todo para executar o comando. Sei que existem ambientes para usar LaTeX, mas eu normalmente escrevo o texto usando Markdown e converto para LaTeX através de um utilitário chamado pandoc (fica a dica). Mas, mesmo que fosse com LaTeX, a vantagem de usar o monrun, para mim, ao menos, é ficar independente de ambiente.

Uau, eu quero

Estou publicando o código no github em https://github.com/wagnerluis1982/monrun. Está tudo em inglês para deixar aberta a possibilidade de voluntários de qualquer lugar.

Como usar?

Usando o README do projeto, a forma mais simples usar é executando

$ python monrun.py -c <COMANDO> <ARQUIVO>

se quiser que o comando seja executado uma vez antes de iniciar o monitoramento, use a chave -b (de before) como a seguir

$ python monrun.py -b -c <COMANDO> <ARQUIVO>

Uma chave -a (de after) também está disponível para sobrepôr um -b anterior ou vice versa.

Conclusão

O uso que estou dando ao programa é o de compilar um arquivo LaTeX sempre que há mudanças. Mas pode haver vários outros usos, como uma mudança em um arquivo de Log, por exemplo.

E claro que ainda há muita coisa que pode ser melhorado como poder dizer de quanto em quanto tempo a mudança será verificada (atualmente é fixo em 1 segundo) e também a habilidade de monitorar mais de um arquivo ou mesmo um diretório. A mudança do tempo é muito simples e nos próximos dias, assim que eu tiver tempo eu já realizo essa alteração, já a outra demanda um pouco mais de tempo.

Se achar o programa util para você e querer melhorar, fork o projeto no github e faça um Pull Request. Mas se não tem conta no github nem quer ter, mande para mim via comentário mesmo (o projeto é de código aberto).

5 comentários:

  1. Vale conhecer o watchdog, feito em Python, com a mesma finalidade, monitorar o filesystem por mudanças. Conheci através do Plone, onde ele é usado para tornar o desenvolvimento mais ágil, reiniciando a instância do Zope quando há modificações nos arquivos Python ou ZCML.

    https://github.com/gorakhargosh/watchdog

    De toda forma, parabéns pelo projeto. Deve ter aprendido bastante coisa no caminho.

    ResponderExcluir
    Respostas
    1. Grande Davi!

      É, eu imaginava haver algo assim, mas tava com preguiça de pesquisar e (você adivinhou) estava querendo aprender um pouco mais.

      Vou dar uma olhada no watchdog, quem sabe eu consiga adicionar algo ao projeto :), obrigado pela sugestão!

      Excluir
    2. Opa, Davi. Acabei de olhar o watchdog e, olhando, por alto (bem por alto mesmo), eu acho que ele não faz a verificação do conteúdo do arquivo.

      No monrun eu montei o seguinte algoritmo para identificar diferenças:
      - verifica mtime
      - se mtime diferente, verifica tamanho
      - se tamanho igual, verifica md5

      Dessa forma, o comando só será executado mesmo se o arquivo foi modificado.

      Excluir
  2. Respostas
    1. Que watch? Se for o utilitário do unix (também presente no Linux), ele não serve para esses propósitos...

      Excluir