02 agosto 2023

RetroCON 2023

Neste domingo (30), tive o prazer de estar presente no primeiro evento de retro games de São Paulo, a RetroCON. Foi uma experiência incrível. A quantidade de GAMES disponíveis para jogar era imensa; ficaria até difícil listar todos aqui. Talvez eu nem tenha conseguido ver todos. Dos que joguei e me lembro, destacam-se: Atari 2600, Mega Drive, Super Nintendo, Xbox 360, Arcade (ou fliperama) e Playstation 4. É curioso mencionar o Playstation 4, mas ele estava lá para rodar o Top Racer, um jogo moderno com visual e mecânica retrô que lembra muito o Out Run do Mega Drive.

Não houve apenas vídeo games para jogar. Havia diversos estandes para comprar camisetas, pôsteres, jogos, apresentações de games retrô e também uma exposição mostrando a história e as gerações dos games ao longo do tempo.

De lá, trouxe um pôster do SONIC 3. A escolha foi realmente difícil, dada a variedade de opções, tamanhos e alguns até com molduras!

Além de decorar meu escritório com um pôster de um dos meus jogos favoritos, ele também servirá como uma boa lembrança desse evento.

Fiz alguns poucos registros fotográficos desse dia épico:





Jogos novos para games antigos;



Encerramento do evento com palavras finais dos organizadores



04 abril 2023

Orçamentos rápidos com "DIN"

Já me peguei em várias momentos tendo que fazer uma lista de “compras” ou de divisão de despesas em um bloco de notas. Sempre é eficiente e prático, basta abrir um arquivo texto e começar a digitar a despesa em si e seu valor e ao fim o sub-total e total para manter a organização e posteriormente se necessário compartilhar entre os envolvidos. Isso nunca foi o problema, porém com maior frequência essa pode ser uma atividade um tanto quanto trabalhosa, descrever, calcular em aplicativos distintos e ainda organizar essas anotações.


A fim agilizar um pouco mais minha atividade, criei um pequeno aplicativo web (webapp) para realizar essa função, o DIN. Um WebApp que me permite inserir entradas e saídas e ao fim der o resultado final e com a descrição de cada item independente da sua razão. Além de simples é bem intuitivo pois contém uma interface simples e objetivo, contando apenas com 2 campos ao fim da tela para inserção dos dados.

É necessário ainda aprimoramentos, inclusive visuais, mas a função principal que é a de listar os recursos, seja de entrada e saída, está sendo feito que era meu objetivo. Para um futuro, talvez algumas melhorias funcionais como editar um registro já inserido ou poder remover um registro e também um uma melhoria visual no campo referente ao preço para diminuir a fricção na hora de inserir valores monetários que exigem a inserção de ponto atualmente.

08 março 2023

Limitando uso de recursos de máquina pelo Docker no WSL2 (VMMEM)

 Trabalhar com containers no Windows tornou-se fácil depois do WSL2. Com ele é possível ter uma experiência de usabilidade próxima ao GNU/Linux, porém existe um problema crônico em toda solução Windows que é o excesso de uso de memória RAM, causando lentidão e travamentos no sistema, afetando outros serviços e recursos. No Docker for Windows não é diferente, após fazer a instalação e integração com WSL2, é necessário deixar explicito o limite de uso de recursos, seja CPU ou RAM.

Como limitar?

No meu caso, estava com um sério problema de excesso de uso de memória RAM. Minha máquina é bem limitada, porém o Docker com o WSL utilizava em médio 70 à 90% da memória (de 4GB). Meu objetivo era limitar a 1GB de uso, apenas da memória RAM. Para isso é necessário criar um arquivo .wslconfig no "HOME" do Windows (%UserProfile%/.wslconfig, o mesmo que C:\Users\<meu usuario>\.wslconfig).

Abra o explorador de arquivos (win + E) e na barra de endereços digite:




Após aberto o editor com o arquivo, basta limitar o número da memória RAM a ser utilizada:

[wsl2]
memory=1GB
debugConsole=true

Além de notar o desempenho melhor para confirmar a configuração, é possível visualizar no Gerenciador de Tarefas o processo VMMen com consumo abaixo dos 1GB:



Referências:

06 janeiro 2023

Manipulando caminhos (path) e arquivos no Python moderno

Uma atividade comum no desenvolvimento de software com Python é a manipulação de arquivos e caminhos do sistema operacional. Seja para leitura de um arquivo ou a escrita do mesmo em qualquer que seja o caminho destino. Isso não é complicado no Python com a ajuda da biblioteca os e a instrução open, por exemplo. Porém podemos acabar tendo que descrever em mais linhas que o necessário em versões mais modernas do Python ou utilizando bibliotecas "pobre" de recursos para este fim. Tomemos como exemplo um trecho de código comum em muitos programas escritos em Python (2 ou 3). O objetivo deste pequeno trecho de código é ler o arquivo de configuração do git, se existir, caso contrário não retorna nada:

import os

git_config = os.path.join(os.path.expanduser('~'), '.gitconfig')

if os.path.exists(git_config):
    with open(git_config, 'r') as raw_file:
        print(raw_file.read())

É um código funcional e cumpre seu objetivo. Mas existem formas "melhores" de descrever essa mesma atividade, em menos linhas, sem truques de abertura ou fechamento de arquivos e com recursos nativos da linguagem.

A partir da versão >= 3.4, Python introduziu o módulo pathlib. Com o principal e único objetivo de fazer manipulações de caminhos e arquivos de forma genérica e compatível com diferentes sistemas operacionais. Além de não retornar uma simples string, como é o caso do módulo os.path. o pathlib retorna um objeto Path (se for Unix PosixPath se for Windows WindowsPath). Além permitir uma sintaxe mais expressiva em relação aos caminhos, já que permite o uso de / (barras) como separador o módulo conta com recursos para leitura e escrita sem a necessidade do statement open.

import pathlib

git_config = pathlib.Path.home() / '.gitconfig'

if git_config.exists():
    print(git_config.read_text())

É possível também fazer a escrita de forma mais simples e sem a necessidade do uso do gerenciador de contexto ou fechamento de arquivos de forma explicita:

import pathlib

my_file = pathlib.Path('/tmp') / 'my_file.txt'
content = 'content file with pathlib module'

my_file.write_text(content)