Em múltiplos níveis, é difícil pensar nesse ano. Mas capitão, nem chegamos ao carnaval.
A aleatoriedade da existência agora me trouxe às portas do que vai ser um novo enorme desafio. Partindo de um post sem esperanças no Hacker News, para um processo que por coincidência cósmica eu conseguia responder e perguntar, vou começar a trabalhar em breve na Elastic.
O que resultou numa decisão muito, muito difícil – por mais que, poxa, é A Elastic, deixar para trás um emprego em meus termos foi inédito, e não foi fácil. Tanto que acho que ainda não processei o que está acontecendo. As coisas já foram devolvidas, a conta da empresa já não existe mais, mas acho que ainda não absorvi o fato de que eu pedi demissão.
Também tem o fato de ter que fazer o processo e segurar a onda sem medicação, e torrar ainda mais o cérebro para manter o trabalho que já tinha.
É um risco que eu tenho que correr, mas assim é a vida adulta, pelo jeito. Quisera eu poder falar para o meu eu que começou a escrever em 2002 que eu teria que tomar decisões assim. Tudo é tão difícil, e tudo imprime tanta culpa.
Eu tenho que tentar enfiar a cabeça no que pode sair de bom disso, claro.
Ao menos no que compete às entrevistas, eu me saí bem. Depois da bola de neve de dívidas se resolver, eu vou poder não ter que pagar aluguel no crédito. É uma oportunidade rara entrar em uma das maiores empresas do ramo do mundo.
Criei um outro blog para escrever apenas coisas técnicas, e este vai ser bilíngue. Eventualmente (In)Consistente está disponível em inglês e português, e vai ser uma oportunidade de relembrar um pouco de Go e do modelo de templating dele. Se bem que eu deveria era pegar Razor por agora, que vou usar no projeto para onde vou.
Outra coisa que eu queria resolver era meu www. É tão difícil não ser imensamente esdrúxulo! Fazer um brainstorming do que deveria existir ali é complicado.
Eu não consigo pensar em outra coisa que não seja, foi um ano cruel comigo.
É um ano que vai deixar uma ferida pra vida toda, com a perda do meu irmãozinho, o Otto. Eu ainda não consigo lidar com o luto, e praticamente não tem um dia que eu ainda não desabe no choro em um instante ou outro. Agora mesmo, tentando escrever, já fica difícil enxergar e respirar. Não tem nada que eu queira mais no mundo que um abraço dele, sentir ele dormindo na minha barriga, ver ele deitado do meu lado enquanto trabalho. Minha mãe também continua inconsolável um mês e meio depois, e a Kika claramente também sente.
O ano já começou com a urgência de ter que mudar – e com todos os gastos que pipocam disso. Foi uma dificuldade substancial encontrar um lugar.
E então, todo mês acontecia alguma coisa com uma conta que simplesmente não fechava. O Otto teve 3 internações, duas delas com cirurgia. Teve o custo de sua cremação, também. Dois pneus estouraram no intervalo de 2 semanas. O meu HD onde estavam todos os meus projetos pessoais, todo o meu investimento emocional, foi pras cucuias e não tive opção que não fosse pagar pelo processo de recuperação de dados. Torneira da pia não fechava mais o registro, tudo do bom e do melhor em matéria de coisa ruim. Consultas médicas sem cobertura de plano. Consultas veterinárias. Medicação, muita medicação. Gasolina. Todo mês tendo que escolher se pego um empréstimo mais perigoso ou parcelo tudo e deixo para o eu dos meses seguintes.
O trabalho com altos e baixos – pude aproveitar brevemente boas companhias e um fluxo de trabalho onde foi possível aumentar bastante minha confiança de um modo geral. Mas ao custo de um longo, longo período em que eu fiquei em constante pânico de não saber se continuaria empregado pela falta de clientes.
Eu me sinto profundamente esmagado pelo peso de tudo. A minha salvação foi estar com quem estou, que tem segurado a onda do meu psicológico no cotidiano como pode.
No meio disso, consegui lançar mais ou menos um par de pequenos projetos, e um portfólio. Claro que sem conseguir um design decente para qualquer coisa. Dê-me uma linha torta e eu não consigo terminá-la.
A ideia eventualmente seria lançar um blog separado para falar apenas de tecnicalidades, bilíngue. Claro, para ninguém continuar lendo.
Eu tinha começado a escrever achando que ia conseguir falar de uma coisa aqui e ali que eu queria tentar fazer, mas é muito, muito difícil querer fazer qualquer coisa. O mais próximo de “jeito” pra muita coisa aqui, é esperar – e torcer para não acontecerem ainda mais bombas, até que eu pare de dever tanto mês a mês.
Gente, continua não sendo trivial. Mas pelo menos acho que não quebrei o servidor completamente.
A última vez que eu tinha colocado o Gitea, meio que o subdomínio dele se sobrepujava ao www, e tinham algumas coisinhas irritantes que não funcionavam 100%.
Mas eu vi que rolou bastante drama, e o Gitea que era um fork do Gogs porque o Gogs ficou muito comercial, ganhou um fork porque ficou muito comercial. E nasceu o Forgejo.
Depois da enorme desventura que foi gastar uma fortuna pra recuperar alguns dados de um SSD falhando da pior forma possível na minha cara – imediatamente antes de eu ter um backup do que eu mais precisava nele – acabou o rolê de protelar. Até porque estou quase perdendo outro disco.
Então a parte do código e de coisas tangenciais a código vão ganhar no mínimo um lar constantemente atualizado no Gitão dos Bróder pra evitar essa caca. Aí o que for interessante fazer, vou espelhando no Github.
Mas era importante aqui registrar que não foi só criar um docker-compose.yml e um usuário no banco para ele.
Túneis e Tapas
Se você caiu de para-quedas no rolê, para desembolar uma instância de uma plataforma de código como Gogs/Gitea/Forgejo, ou Gitlab, ou qualquer outra coisa que permita que você mesmo hospede as coisas, você tem que ouvir e atender pedidos da parte “site” da coisa, e ouvir e atender pedidos SSH, que o git usa para transporte autenticado de dados.
Aí você tem algumas opções. A que fica mais simples para um usuário… usar, é manter a porta 22 para o usuário git.
Isso era o que eu queria.
Bati a cabeça um pouco tentando as indicações da documentação do Gitea (porque o Forgejo meio que esqueceu de documentar isso), e eventualmente teve uma combinação de opções que me fez sacar o que era para acontecer; a maior parte sendo um shim do executável que na verdade faz o túnel para o contâiner como indicado na documentação do Gitea.
Bash
addusergitusermod-aGdockergitusermod-aGsudogit
Com isso, temos o usuário para receber os pedidos SSH do Git. Agora, é hora de conferir se tudo no docker-compose.yml faz sentido.
Os detalhes de importância são ele escutar explicitamente o localhost na porta 22922, e ter um link de volume para a pasta .ssh do usuário externamente.
Eu tava de férias, né. Como era de se esperar, foi difícil ter um instante aqui e outro ali. Mas tava saindo um livro de visitas. Um projetinho bem anos 90, com uma roupagem dos tempos quase atuais – com a licença poética de não usar uma linguagem tão da hora e do momento.
Mas tinha de quase tudo um pouco ali; captcha do Cloudflare para coibir spam, uma API caprichadinha para receber e ter um gerenciadorzinho, com JWT configurado bonitinho, refresh token…
Tinha um design usando (ainda que fosse overkill, mas a ideia era entender mesmo) Clean Architecture, CQRS, tudo refinadinho. Usei até MongoDB, que nunca tinha mexido.
Criei um Dockerfile, criei um docker-compose.yml, e o mais importante: criei um docker-compose.yml que funcionou muito bem. Ele segurava as variáveis de ambiente que o backend usava, e fez tudo certinho. Rodava junto com o MongoDB e até um Manager enquanto não fazia o frontend.
Francamente, tava legal. Dava pra usar para começar a ter um mini-portifólio. Pelo menos eu podia mostrar que consigo desembolar esse tipo de coisa, ainda que não esteja trabalhando com isso agora.
Fiz a documentação inicial no README, conferi se podia usar a GNU AGPLv3, fiz uma página com um exemplo da parte do envio das mensagens pro livro. Tava pronto pra publicar no repositório.
Mas aí eu pensei, não, vou só adicionar logging primeiro. “Vai ser legal deixar um Serilog pronto, mesmo que com um sink só pra arquivo. Qualquer coisa coloca um sink pro Seq e adiciona ele no docker-compose.yml.”
O castigo vem de bicicleta.
Eu tinha considerado várias vezes manter uma instância do Forgejo aqui no meu servidor, e espelhar as coisas no Github. Me permitiria não ter muita cerimônia pra salvar o que eu quisesse. Mas protelei.
Eu pensei várias vezes na estratégia que devia tomar pra começar um backup mais extensivo e automático de coisinhas jogadas em trocentas pastas pelos discos. Ou, finalmente, centralizar tudo e então replicar. Mas protelei.
O SSD onde estavam todos os projetos que ainda não tinham repositório externo, uma quantidade difícil de saber de dados que podem ou não ser importantes – porque a minha memória continua sendo um lixo – e a maioria das aplicações e definições de aplicações, foi pro saco.
Levei para uma empresa de recuperação de dados, identificaram que foi o controlador, e vai dar um custo insano. SE der certo. Se não der certo, vai ser só um terço de insanidade pela tentativa.
Agora eu nem sei por onde recomeçar, pois francamente ainda estou atônito. As coisas que já estavam sem gosto, agora estão intragáveis.
Façam backup, pessoas. Especialmente se você acha que dividir dados entre discos para reduzir danos resolve por um tempo. Nem era meu SSD mais antigo ou mais usado.
Agora é ficar olhando pras feridas, sem saber como lamber.
É impressionante como ainda é porco o suporte para temas escuros na administração do WordPress. Que sufoco pra colocar uma cor legível para… texto normal.
Só que agora, depois de décadas de árdua contestação das regras arcanas de outrora da FAPESP, que mantém o Registro.br, finalmente sou o detentor de um domínio que almejava desde a infância.
O de agora.
A última vez que lembro ter pesquisado, o domínio era de um squatter – pois se procurarmos na Wayback Machine não encontramos nada. E antes disso, nem era possível que uma mera pessoa física como eu pudesse ter um .com.br. Já tive o .net.br por um tempo, que por motivos insanos era mais permissivo que o .com.br. Exigiam CNPJ e o caramba – documentação e mais documentação. A flexibilização disso é um fenômeno que chegou com penoso atraso, e a interface de gerenciamento do Registro.br é péssima. Ainda bem que pelo menos funciona fazer essas coisas pelo Cloudflare.
Mas como nada é fácil para o cidadão, .com.br é um dos domínios que o Cloudflare não atua como registrar. Assim como o .moe. Então ele só atua como DNS e cache mesmo.
Mas eu confesso que vou sentir falta do .moe. É uma decisão difícil.
Cotti.moe – uma breve eulogia
Foi uma disputa de prioridades entre o que me define e o que eu desejava. Certamente o charme da leviandade do .moe é a minha cara, ter que explicar o conceito é menos.
Mas a minha criança interior, ironicamente, queria a pomposidade que o .com.br proporcionava (na falta do .com, que hoje em dia é de uma marca de café, e da última vez que vi à venda custava a bagatela de pelo menos 50 mil dólares).
Inclusive a questão do nome foi um dos principais motivos para minha escolha na época do Homestead ao invés do gigante Geocities. Outra foi o espaço, 8 megabytes ao invés de uns… 5? Aí tão pedindo pra lembrar muito. Um simples subdomínio no 8m.com (que agora é controlado por um squatter chinês, que tristeza a queda do Homestead), ao invés das 3 ou 4 subpastas no Geocities. Estamos falando aqui de 1999, quando opções de redirecionamento como o cjb.net e o .tk ainda reinavam – ao custo de pop-ups. Opções menos invasivas eram muito bem-vindas, e lembro do Homestead ser mais tranquilo que o Geocities, que também tinha pop-ups.
Mas onde eu estava? Na vontade de ter um domínio e tal. Isso. Eu tive, não necessariamente nessa ordem, .biz, .net.br, .moe e agora .com.br. Talvez algum outro…? Realmente nem lembro mais. Faz parte também da minha década perdida, então já viu né.
Mas foi divertido. Passei por diferentes serviços de VPS, cada um comigo fazendo mais caquinha que o outro. Passei a ter o famoso email próprio, ainda que gerenciado por fora. Enquanto eu ainda for dono dele, vai redirecionar qualquer coisa pra cá, mas tenho medo dele virar bolor – ou pior, um squatter comprar. Hoje tem de tudo…
Mas se pá ainda tem espaço para projetos que com alguma certeza não devem ficar por aqui. Vai saber…
Até lá, você me acha aqui. Quer um email mais fácil que felipe@cotti.com.br?
Coisas que eu não vou conseguir entender tão cedo, parte 935612198
Por que StreamReader e StreamWriter não se dão bem com métodos de extensão…?
Fiquei uma semana empacado nessa bagaça. Acabou que uma ideia quase tão boa quanto – de criar um par de callbacks pra cuidar de serializar e desserializar as mensagens de uma Pipe – funciona direitinho e posso usar a lasanha de tipos que eu bolei.
Esse post estava n’O Bifão, uma tentativa (como todas as outras, falha) de manter uma espécie de blog nesses tempos tão difíceis em que tudo se resolve em volta de rede social.
Um ano de um trampo bem diferente, ainda que cheio de paralelos – que ajudaram na colocação pra começo de conversa – me fizeram ir pra vários lugares diferentes, tecnicamente.
Eu tinha pensado por um tempo já em fazer um balanço do que sem querer ou por querer aprendi no ano. Fui testado pelas circunstâncias e pelos requisitos, e deu pra construir um pequeno playground cutucando coisas aqui e ali.
1. AvaloniaUI
Já tinha um bom tempo que eu ficava de olho numa alternativa a fazer alguma coisa para desktop, com C#, que não fosse o WPF. Ou WinForms.
Ou WinUI. Ou UWP.
Ou Xamarin. Ou MAUI.
Francamente, a confusão que eu fiquei quando criei um projeto de brincadeira com MAUI não tá no gibi. E eu já me esqueci de tudo que eu já tinha decorado que era bom de fazer em um projeto novo com WPF. E, de toda forma, ser independente de plataforma é essencial pra mim.
Então veio a oportunidade de mexer com um produto em que eu pude escolher as coisas desde a incepção, e na criação da prova de conceito decidi prender a respiração e usar o AvaloniaUI, o qual já tinha ouvido falar anos atrás. O tempo para colocar as coisas em um nível testado era curto, então o ideal era não errar nessa escolha.
Confesso que minhas melhores expectativas foram superadas. É como o WPF devia ser desde o começo. Não que eu não tenha encontrado alguns pontos onde empaquei, ou onde eu não veja sentido nas escolhas (é um suplício trocar a cor da marca do CheckBox corretamente), mas a maior parte do tempo usando o AvaloniaUI é genuinamente divertido.
MessengerPlusSoundBankExtractor, um dos prováveis programas mais de nicho de todos os tempos, é um extrator de áudios de pacotes de backup do já extinto por mais de 10 anos Messenger Plus – e usa AvaloniaUI.
2. AppImage
Tá aí uma outra coisa que eu tinha curiosidade mas não tinha oportunidade. Desembolar um AppImage que funcionasse, e conseguir enxergar – ainda que parcialmente – a lógica por trás.
É bem satisfatório ter um programa para desktop prontinho pra GNU/Linux (e funcionando), sem mexer uma linha de código do que é gerado pra Windows.
Incidentalmente, isso foi em boa parte contribuição do excelente PupNet-Deploy, que serviu de base para depois sair futucando ingratamente no AppImage que ele criou até ver como as peças se encaixavam. Ler especificações é para quem nasceu sabendo, afinal.
O que ainda é um pouco confuso pra mim é que aparentemente existem múltiplos empacotadores de AppImage por aí. Mas depois eu aprendo o que está acontecendo. Certamente é melhor que Flatpak e Snap…
3. Instaladores
Criar um instalador (especialmente e especificamente para Windows) não é uma tarefa exatamente casual (especialmente e especificamente antes de aprender sobre o PupNet-Deploy, mas isso são outros nhenhenhentos).
Graças ao vídeo-tutorial-bateção-de-cabeça do AngelSix mostrando o passo-a-passo de criar um instalador usando o WiX (versão 3), eu eventualmente consegui criar um instalador usando o WiX (versão 3).
O bendito tutorial. Como eu tive paciência, você pergunta? Eu não tive, é a resposta.
A complexidade é um belo exemplar de Desnecessaurus Rex. Mas funcionou bem, e depois da configuração inicial não precisei mais fazer alterações.
A experiência de conhecer o mundo dos instaladores para Windows
4 – Não Deixe O Paralelismo Passar Fome Por Causa De Uma Linha
Necessidade é o Frank Zappa & As Mães da Invenção, já dizia o velho deitado. Quando você tem que usar uma biblioteca pra escrever um arquivo do Excel, pior ainda.
Passar por potencialmente todos os arquivos de um disco, que pode ser uma unidade de rede ainda por cima, tem um bom custo de I/O. Como muitas propriedades mais particulares deles eram usadas, tem uma quantidade interessante de syscalls sendo feitas.
Claro, um belo Paralell.ForEach() foi usado – com configurações bem-definidas (ainda que agressivas) de processamentos simultâneos, checagens colocadas no lugar certo se aquele loop deveria cessar, tudo do bom e do melhor.
Ele voa de cara!
Ele voa menos quando um disco em rede com mais de 2 milhões de arquivos é usado. Na verdade parava nos 8% depois de 25 horas.
Algo de errado não estava certo. Essas coisas deviam ir pra 100%. A conclusão é que alguma coisa estava causando thread starvation. Mas que tipo de coisa arcana e indomável podia fazer isso? Era o acesso à rede? Era essa busca por propriedades mais aprofundada nos arquivos?
Deixei um profiler rolando por uns minutos escaneando meu disco local todo. O problema tá lá também. Não era acesso à rede.
O que podia ser? Tudo que a gente fazia era pegar os arquivos, ler essas informações, jogar numa planilha de Excel, adicionar uma regra de validação em uma coluna…
Opa.
O profiler indicou o culpado – ninguém menos que o método de inserir validação na planilha do Excel. De alguma forma ele tende a travar a thread. E se a gente não ser só ingenuidade e adicionar a validação de uma só vez selecionando a coluna inteira depois de adicionar todas as linhas?
Mudar uma linha de código de um lugar para o outro, e mudar o parâmetro de uma linha só para um range de colunas. Agora atravessar o disco de rede inteiro leva umas poucas horas, e não desacelera. Faz um tempo bem melhor que a solução anterior do cliente, que era feita em VB6.
5 – Patinho de borracha
Em meio a alucinações e devaneios, se esconde um bom patinho de borracha.
A inegável beleza da Internet contemporânea, em toda sua glória.
Patinhos de borracha substancialmente sujos e desbotados.
A inegável beleza da Internet contemporânea, em toda sua glória.
Assim é um LLM. Não caí de anel assim pelo ChatGPT da vida, mas descrever o problema e olhar com cuidado as respostas já me economizou um bom tempo.
Mas é impressionante como as coisas evoluíram de pouco tempo pra cá.
Eu tenho usado o Phind, que é otimizado para desenvolvimento, e provê algumas buscas usando GPT-4 por dia. Mas mesmo quando o modelo com o GPT-3.5 é usado, os resultados são na média muito bons.
É só garantir que não tem lama no meio. É relativamente comum alucinações em que são usadas APIs que foram removidas, por exemplo – mesmo quando a versão da coisa que você está usando é especificada.
Talvez pela última vez outra vez, o aquático membro do Pink Floyd Roger Waters nadou nas nascentes que deságuam nas enchentes da Avenida Silva Lobo no Curral Del Rei, procurando a tal batida perfeita – que ele teria encontrado, tivesse ele surfado no Anel Rodoviário.
Ou fez um show no Mineirão. Ainda assim, talvez pela última vez. Outra vez.
A turnê This is Not a Drill traz o Roger mais à vontade para escancarar sua política, o que é bem-vindo pra cacilda. Quem me dera ele estivesse assim já na turnê de 2018, que teve já uma intensificação mas ainda pareceu light.
Engraçado, eu achava que eu tinha tudo pra ser um farofeiro quando eu ficasse um velho sórdido e covarde. Agora que eu formei minha pupa de quase-meia-idade para chegar em minha forma final, me sinto muito mais interessado quando as coisas são repaginadas na minha frente. Por bem ou por mal.
Eu até consegui ficar relativamente livre de spoilers da setlist. Então foi supimpa depois do anúncio ao início mandar os fãs de Floyd que não gostam da politicagem do Roger ir pro bar – com toda a gentileza, o show começar com a versão sepulcral, pós-apocalíptica de Comfortably Numb 2022, uma elegia para o mundo. Que telões, viu.
Eu prefiro o cenário em forma de cruz usado nos shows mais intimistas, mas Brasil é país de show de estádio, fazer o quê. Deu pra fazer algo interessante ainda assim – mas pra mim ficou claro que estavam improvisando ainda algumas montagens.
Vamos de Bom, Ruim e Feio? Vamos.
O Bom
Uma das melhores coisas que aconteceram na carreira do Roger foi o envelhecimento dele. Ele passou de estagiário do Coringa pra irmão do Richard Gere, e de uma ovelha asmática para um senhor que viu algumas coisas e não voltou de lá.
Wish You Were Here foi cantada uma oitava abaixo, e encaixa muito melhor pra ele, num take mais intimista, enquanto conta uma história com o Syd. …E enquanto cuidadosamente evita o Gilmar.
Have a Cigar cai dois tons também, se rendendo à supremacia do Dó Menor.
Pegou uma coisa do Radio KAOS aqui, uma do Final Cut acolá, e uma do Amused To Death. The Bar como material novo, com reprise recontextualizada. Me likey.
A mensagem política nunca esteve tão escancarada no primeiro plano (não que The Wall por exemplo não estivesse, mas é mais apegada à narrativa), e que alívio deve ser ficar menos e menos inibido. Ele tem alvos mais definidos que no Us+Them.
O Ruim
O palco. A versão para megashow de estádio brasileiro está bem aquém tanto do palco em cruz das etapas mais abençoadas da turnê, quanto até mesmo do palco do Us+Them de 2018, que claramente teve mais cuidado e foi pensado para a ocasião.
As imagens em si até funcionaram, mas o impacto poderia ser melhor. Muita coisa pareceu improvisada e de última hora, e eu não ficaria surpreso se realmente fossem. Uma pena para um array de telões tão estupidamente bem definidos.
Nessa nota, não terem negociado pra trazer o palco (e nessa quebrar um pouco a ideia da pista premium) foi um ponto bem baixo. Poxa, Rogério.
O Feio
Pra variar… as pessoas, né. Fumantes reclamando de gente que invade pontos-chave de área de arquibancada pra ficar em pé. Os dois grupos poderiam fazer o favor de não serem ruins para as outras pessoas, mas é difícil demais.
O tropeiro do Mineirão dá até vontade de comer já que só se entra nesse lugar de 5 em 5 anos, mas nossa como é indigesto.
E eu estou esperando a mesma coragem de não tocar Time para não tocar Another Brick in the Wall pt.2! Toca a parte 1, PULA A PARTE 2, toca a parte 3, Rogério! Coragem!