Meu Fluxo de Trabalho

11 Jun 2021 . category: article . Comments
#linux #neovim #terminator #fedora #ambiente de desenvolvimento

Já faz quase 10 anos que escrevi meu último artigo sobre esse assunto. Daquela época para cá poucas coisas mudaram, posso dizer que evoluíram mas não houveram grandes mudanças.

Antes de falar sobre meu fluxo atual de trabalho vou falar um pouco do que mudou.

As mudanças

A primeira coisa que mudou é a distribuição GNU/Linux que utilizo. Nesses 10 anos deixei o Slackaware e cheguei a usar por um bom tempo o Ubuntu (por causa do notebook do trampo) e me aventurei com o Arch, Manjaro, OpenSuse e Gentoo, porém sempre acabo voltando para o Fedora.

Gosto bastante do Fedora tanto pelo sistema em si quanto pela filosofia da Red Hat (pelo menos até o momento em que escrevo esse texto, não sabemos o que pode acontecer com a compra pela IBM).

Outra mudança é que deixei de usar o gVim e comecei a utilizar o NeoVim diretamente pelo terminal mesmo, sem nenhuma interface gráfica pois, para mim, não há necessidade para isso. Também passei a utilizar um gerenciador de plugins e fiz uma limpa em tudo que utilizava e fiz uma seleção do zero.

Utilizo o NeoVim para programar tudo o que eu faço. As principais linguagens que utilizo atualmente são: Python, Java, Ruby, Crystal, Javascript, faço algumas coisas em Rust e Go. E quando quero me divertir ainda brinco com C/C++.

O emulador de terminal que utilizo na maior parte do tempo ainda é o Terminator. Passei um bom tempo utilizando outros, principalmente o Termite, porém tive alguns problemas acessando servidores ssh e acabei voltando para o Terminator. Também deixei de usar o Bash há alguns anos e adotei o Zsh.

Uma grande mudança, a maior de todas, acredito eu, foi a troca de Gnome 3 pelo i3. Já faz uns 3 anos que fiz essa troca e ele tem me servido muito bem. Acredito que hoje não conseguiria fazer o caminho oposto e voltar ao Gnome 3.

Para gerenciar todo o meu ambiente abandonei os meus scripts e antigos dotfiles e passei a utilizar Ansible para fazer toda a instalação e controle de mudanças. O repositório está em https://github.com/diegorubin/environment.

Meu Desktop

Como já escrevi, atualmente faço uso do i3. Para as barras estou utilizando o Polybar. Utilizo duas instancias no monitor principal. Na barra superior, da esquerda para a direita, tenho os seguintes módulos:

  • Gerenciador de workspace do i3;
  • Um módulo para exibir quantas horas ainda faltam para terminar o meu dia útil (essa informação vem do meu sistema de apontamento de horas, vou falar dele em um tópico posterior);
  • A tarefa que estou trabalhando atualmente com um timer de pomodoro (essa informação eu pego do Gnomato);
  • O próximo módulo exibe o título da janela ativa;
  • Depois tenho os seguintes valores: volume (pego do pulseaudio), cpu, memória, bateria, temperatura do hardware, espaço disponível de alguns discos que tenho conectado, data e hora;
  • Em seguida eu tenho um módulo que mostra o próximo evento do meu calendário (recupero esse valor do Google Calendar);
  • E por fim, um botão que exibe um diálogo com opções como fazer logoff ou desligar o sistema operacional.

Desktop

Na barra inferior estão os seguintes módulos:

  • Systray;
  • Exibe o que está sendo tocado;
  • Um módulo que checa se o Golem está em execução (falarei dele logo mais neste artigo).
  • Um módulo que checa conexões de VPN (a VPN do trampo tem seus momentos de instabilidade, me ajuda a saber se está conectada corretamente);
  • O próximo exibe a rede wifi que estou conectado;
  • E por fim, exibe o layout do teclado atual.

Alguns utilitários

Gnomato

Desde 2011 eu venho trabalhando em uma aplicação para gerenciar tarefas visando utilizar metodologias como a Pomodoro e a ZTD. Já escrevi sobre sobre ele no artigo A Técnica Pomodoro, Linux e o Gnomato. O artigo provavelmente está defasado em alguns pontos, mas de modo geral pode apontar alguns caminhos.

Golem

Para centralizar minhas integrações entre sistemas externos e recursos do sistema operacional eu criei uma espécie de backend para meu ambiente. Ainda não consegui disponibilizá-lo como opensource pois existem recursos nele que são muito específicos e que não posso deixar público. Um dos meus objetivos é criar um sistema de plugins para o mesmo. Meu objetivo em falar dele nesse artigo é para que ele sirva de exemplo para outros desenvolvedores.

Essa também foi uma oportunidade para experimentar uma linguagem que me interessou bastante, a linguagem Crystal.

O Golem tem algumas interfaces de integração. Entre eles faço uso de eventos que chegam através de filas de um servidor NATS, um sistema de agendador de tarefas e APIs rest. Criei também uma página que serve de dashboard e é sempre exibida quando abro uma nova aba no Firefox.

Golem Dashboard

O Golem também tem uma interface de linha de comando para facilitar algumas tasks. No vídeo abaixo mostro um exemplo de atualização de status.

Algumas tarefas que estão no Golem:

  • gerenciamento de algumas configurações;
  • centralização dos volumes de alguns dispositivos de som;
  • recuperação de alguns feeds rss;
  • recuperação de eventos da minha agenda;
  • realização de backups de alguns arquivos importantes.

Seleção de itens

Como ferramenta para selecionar itens de uma lista estou utilizando o rofi. Utilizo para abrir aplicativos gráficos e para selecionar outros recursos, como selecionar um servidor entre uma lista para acessá-lo via ssh.

Neste primeiro vídeo mostro abertura de uma aplicação.

Neste segundo vídeo mostro a abertura de console via ssh.

Para selecionar itens direto no terminal eu estou fazendo uso do navi.

Meu Fluxo de Trabalho

A Ci&t, empresa onde trabalho, gerencia as tasks através do Jira, para facilitar minhas interações com o sistema criei uma série de integrações entre algumas aplicações que facilitam meu controle de tarefas, geração de relatórios e apontamentos no próprio Jira (sem ter que gastar muito tempo em sua interface). Nesse sentido, como faz um tempo que faço a gestão das minhas tarefas de uma forma organizada (tenho registros de tarefas desde 2012), resolvi disponibilizar um pequeno site com algumas informações do dia a dia com objetivo de dar mais visibilidade das tarefas aos meu pares e gestores. Basicamente, tentei automatizar a daily.

O registro de atividades é a parte mais útil das minhas integrações, mas tenho trabalhado para automatizar outras coisas. Gosto muito de analisar e refletir sobre melhorias na execução das minhas tarefas no dia a dia. Para exemplificar o que estou tentando dizer fiz um desenho de alguns fluxos.

Golem Integrações

Abaixo irei descrever os fluxos que acho mais legais.

1. Recuperação dos Registros de Horas

O tempo gasto por tarefa fica armazenado no Gnomato. Nele eu gerencio algumas listas de tarefas, cada lista representa um backlog de uma frente. Todo dia de manhã, seguindo o ZTD, eu alimento uma lista com as tarefas para o dia (levando, também, em consideração os eventos marcados na agenda).

O Golem recupera os registros de apontamentos de hora do Gnomato via DBus (o Gnomato expõe uma série de métodos para manipulação e recuperação de dados).

Além das horas, o status das tasks também são recuperados do Gnomato e quando finalizado no Gnomato também será finalizado no sistema de status.

2. Apontamento de Horas

Os logs de horas são enviados para o meu sistema de status pelo Golem.

Pelos logs de tarefas eu consigo saber quantas horas ainda preciso trabalhar no dia. Esse valor é exibido em um widget no Polybar. O tempo total esperado para o dia estão registrados no meu sistema de Status.

Workday Remaining

Quando estou devendo horas no dia o ícone aparece em vermelho e quando já está passou do horário o ícone exibido em verde.

3. Enviando as informações de apontamentos de horas para o Jira

No Golem existe a integração com o Jira. As tasks no Gnomato possuem tags, uma dessas tags é o código do Jira. Quando houverem apontamentos em tasks que possuem tags com código do Jira, esses apontamentos também são sincronizados no Jira.

4. Próximo evento do calendário

Além de exibir o tempo faltante para finalizar o dia (mas sempre tem as horas extras), também utilizo o Golem para exibir o próximo evento no calendário no Polybar. Ao clicar no evento, o link para o Google Meet é aberto. Ajuda muito a não perder nenhum evento.

5. Recuperação das mensagens do Chat

Exite uma task no Golem para recuperar conversas do Google Chat. Meu objetivo é extrair algumas métricas e centralizar algumas informações (lembra quando não consegue encontrar aquele link que te enviaram?). Também me ajuda a entender o que aconteceu durante o dia. E por fim, realmente gosto de extrair informações de dados brutos.

6. Eventos recebidos via NATS

Um recurso que tenho usado bem pouco mas que quero explorar mais é uso de eventos. Mantenho um servidor NATS e o Golem consome algumas filas de eventos. Atualmente tenho dois tipo de tratamento. O primeiro recebe a mensagem e notifica a interface gráfica através do libnotify e segundo trata as mensagens e as envia para a API da página de status.

7. Wiki

Eu tenho utilizado o VimWiki para gerenciar algumas informações e pensei em utilizar minha página de status para compartilhar essas informações. Criei um comando no cli do Golem para fazer esse sincronismo entre os arquivos locais e a base remota.

8. Sistema de Notas

Além das informações da Wiki, que são informações mais perenes, também criei um sistema de notas relacionado ao dia. Exemplo de uso: quando estou fazendo alguma investigação de algum bug, ou fazendo alguma POC ou levantando alguns dados para montar algum documento, vou anotando o que estou fazendo e sincronizando com minha página de status. Coloquei um exemplo de uso no vídeo abaixo.

Relatórios Mensais

Com base nas informações coletadas tenho gerado um relatório mensal. Abaixo está um exemplo de relatório.

Exemplo de Relatório Mensal

Conclusão

Meu objetivo com a escrita desse artigo era compartilhar um pouco do que tenho feito para melhorar meu dia a dia como desenvolvedor e funcionário, contribuir com ideias e mostrar alguns códigos. Boa parte ainda não é OpenSource, mas pretendo aos poucos ir removendo as coisas que são muito especificas (tornando as mesmas em espécie de plugins) e ir publicando. Caso queriam compartilhar ideias também, ficaria muito feliz em ouvi-las.

E se quiser conhecer meu ambiente, a maior parte dele está no github em https://github.com/diegorubin/environment. Fique a vontade.


Me

Tenho estudado esse mundo mágico da programação desde 2005. Já consegui sustentar minha família usando Ruby, Java, Python, C++ e Javascript. O resto tenho usado para diversão ou aprendizado.