quinta-feira, 3 de julho de 2025

O Verdadeiro Futuro da IA na Programação

A IA está por todos os lados e as previsões mais fantásticas estão sendo repetidas ad nauseam.

Eu ainda não usei IA para programar. Restringi-me a gerar umas imagens engraçadinhas. Entretanto, a IA veio até mim através de artefatos produzidos por programadores.

Os dois primeiros eram programadores fracos, então eu compreendi a dificuldade deles. O primeiro até foi honesto sobre estar usando IA. O segundo escondeu o fato até que fosse incontornável: o código dele tentava invocar uma função que não existe, além de tentar recompilar a si próprio numa tentativa estranha de ser dinâmico.

O terceiro foi uma grande supresa, porque o programador é um sujeito realmente competente. Entretanto, ele estava se aventurando numa área que não domina.

Eu acho que com essa última experiência podemos aprender algo.

Um dos livros que eu mais gosto tem o estranho nome de Zen e a Arte da Manutenção de Motocicletas. É um livro estranho: mistura filosofia com problemas mentais e uma viagem de moto. Em um dado momento, o autor discorre sobre como ele enfrenta a manutenção da moto. A pessoa precisa tanto de um modelo mental de como a moto funciona, assim como observar, no mundo real, seu comportamento. As duas coisas são importantes: um modelo mental razoavelmente sólido e correto e uma observação atenta.

Uma pessoa que tem um bom modelo mental de como uma coisa funciona é um especialista: um mecânico, um médico, um engenheiro, um programador.

A programação hoje em dia tornou-se uma tarefa das mais complicadas, porque envolve muitas tecnologias. Há muito tempo ninguém lida apenas com uma tecnologia sobre uma plataforma bem definida (Turbo C num PC, por exemplo).

As aplicações possuem muitas camadas e muitas tecnologias distintas. Inevitavelmente, as equipes mais produtivas incluem pessoas com habilidades complementares: não é novidade que a especialização é o motor da produtividade.

Isso me leva a concluir que a IA só vai ser realmente útil quando usada para complementar a habilidade de um especialista.

Se as empresas continuarem a demitir, porque acreditam que podem substituir pessoas por LLMs, antevejo que logo teremos problemas por causa de código gerado por IA. Tanto problemas de segurança, como problemas de perda de dados.

Se a pessoa não domina uma tecnologia, ela primeiro precisa estudá-la a fim de adquirir um modelo mental sólido para depois aplicar uma LLM. A IA deve até ser evitada até que o programador tenha um pouco de experiência com a tecnologia.

A minha conclusão é que a IA tem que ser usada como uma ferramenta para especialistas, não como substituta de especialistas.

quarta-feira, 14 de maio de 2025

O Pepe e o Sentido da Liberdade

Mujica faleceu ontem e pensar em sua vida me ajudou a organizar alguns pensamentos que venho alimentando.

Ele falou muito sobre a sua vida e suas escolhas. Apesar de muito admirado pela sua humildade, eu creio que, na verdade, ele era uma pessoa bastante orgulhosa da liberdade que havia conquistado.

O Pepe vivia numa chácara na periferia de Montevidéu, sobrevivia de suas plantações, tinha um Fusca (obviamente, velho), e uma casa simples. Enquanto presidente, doava boa parte de seu salário, porque não tinha utilidade para o dinheiro.

Eu trabalho com software e grande parte dele é vendido por grandes empresas multinacionais. Eu não tenho nenhum apreço por nenhum software proprietário. Detesto a Oracle, o Qlik, o Windows. A minha antipatia vem crescendo nos últimos anos, porque as licenças estão se tornando cada vez mais limitadoras da liberdade do usuário, sem falar na tendência de empurrarem tudo para suas respectivas nuvens.

O software livre tem a fama, injusta, de ser difícil e de não haver o suporte que uma empresa grande poderia oferecer. A minha experiência é que não preciso de suporte para Linux ou Postgresql, porque eles não dão problema (pelo menos, nenhum problema que eu não consiga resolver), enquanto a Oracle é uma fonte infindável de bugs, complicações, e, para piorar, questões de licenciamento que ditam o que pode ser feito e quando tem que ser feito.

A escolha pessoal pelo software livre pode implicar ter que abdicar de algumas coisas, como o Excel ou alguns jogos do Windows. Eu realmente não sinto falta dessas coisas. Há muitos jogos para o Linux e o LibreOffice supre minhas necessidades. Eu sigo esse caminho conscientemente: é a minha escolha e eu usufruo das liberdades dela e o que ficou no outro caminho não me incomoda.

Um computador é uma máquina e deve servir a mim, não a quem a vendeu. As minhas máquinas de trabalho em casa são como o Fusca do Mujica: têm CPUs de 15 anos (i3-540 e Athlon II X4). Enquanto elas cumprirem o que devem, não vou gastar dinheiro para comprar uma máquina mais moderna.

Eu vejo pessoas comprando e vendendo produtos da Apple por preços absurdos e me pergunto como um equipamento acabou por se tornar um item de luxo. Percebo, então, que as coisas de luxo, na realidade, não têm sentido. As roupas de marca, os carros importados, as joias, não oferecem muito mais que a oportunidade de ostentação.

As pessoas estão presas a necessidades que não escolheram conscientemente.

A liberdade é uma escolha que exige, à primeira vista, sacrifícios. Entretanto, acho que é muito mais uma questão de se libertar de pressões que nos são impostas por nós mesmos e sugeridas pelo ambiente. Uma vez escolhido o caminho, os obstáculos são os pontos de apoio para nos impulsionar adiante. Eu escolhi o Linux e estudo os detalhes e cada vez consigo fazer coisas mais interessantes. Uma amiga vegana sabe tudo sobre plantas, conhece receitas, fornecedores, cultiva alguns alimentos em casa. Não é um sacríficio, porque é um caminho tomado conscientemente.

Enquanto isso, as pessoas que ainda não adquiriram consciência de suas necessidades vivem reféns de modas, influenciadores, comidas ultraprocessadas, roupas de marca. E com tudo isso vêm os problemas de saúde, tanto do corpo como da cabeça.

Mujica foi um tipo de influenciador alternativo. Ele era autêntico. Os influenciadores de mídias socias são falsos e as pessoas se apegam a eles talvez por alguma necessidade de pertencimento ou aprovação. Eles são mais um mecanismo do capitalismo tardio para aprisionar as pessoas a noções idiotas sobre como viver e a expectativas fantasiosas sobre beleza.

A liberdade, então, é encontrar o próprio caminho e libertar-se das expectativas alheias. Isso exige um pouco de reflexão e talvez um pouco de coragem; as mídias socias e o marketing não vão ajudar. É importante se desligar um pouco dessas coisas, porque a futilidade que reina começa a se tornar bastante irritante.

Um brinde ao Pepe por uma vida bem pensada e pelas reflexões que nos deixou.

sábado, 29 de março de 2025

Máquina do Tempo

Comprei um relógio Casio em 2025. Escolhi o modelo W217HM-7BV

Minha inspiração inicial foi um artigo sobre o Casio F91W, o modelo mais barato da Casio. Alguém abriu um F91W, encheu com óleo de silicone, e o baixou até quase 5 mil metros de profundidade.

Uma breve pesquisa me revelou que há um universo de pessoas que se divertem fazendo modificações nesses relógios baratos. Existem até mecanismos alternativos, com mais funções. Não há nada que me provoque mais do que um produto que pode ser alterado e usado para além do projeto original.

Eu tenho, entretanto, outros motivos para comprar um relógio. Há décadas eu não usava nada no pulso.

Há 20 anos, havia relógios nas paredes de quase todos os lugares públicos. Acho que as pessoas cansaram de trocar as pilhas e já são raras as demonstrações públicas de pontualidade.

Ademais, eu percebi que há momentos em que preciso saber as horas, mas não quero carregar o celular. As pulseiras fitness que estão na moda são legais, mas precisam ser carregadas a cada poucas semanas e as pulseiras estragam com frequência. Os smartwatches precisam ser carregados diariamente e são caros.

Eu comprei o W217HM-7BV por menos de R$200 e a bateria dura pelo menos 7 anos.

Eu teria, na minha infância, usado o cronômetro para mensurar incontáveis corridas. Agora, perdi o apetite pelas as competições e uso o cronômetro para fazer os ovos cozidos do café da manhã.

Evidentemente, há um forte apelo nostálgico. O pequeno eu teria ficado muito feliz com esse relógio e eu me alegro por ele.

segunda-feira, 10 de fevereiro de 2025

Como Verificar uma Lista de IPs

Um domínio pode ser provido por muitos IPs distintos, então surgiu para mim a necessidade de determinar qual IP não estava respondendo.

O dig permite descobrir rapidamente quais IPs estão relacionados ao domínio no DNS.


dig +short some.random.domain
192.168.10.20
192.168.10.21
192.168.10.22
192.168.10.23

Faça de conta que a minha lista de IPs é bem grande. Quero testar todos, mas sem perder muito tempo em cada um. Para ser mais rápido com o ping, podemos usar umas opções incomuns:


ping -w 1 -c 2 192.168.10.20
PING 192.168.10.20 (192.168.10.20) 56(84) bytes of data.

--- 192.168.10.20 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

O -w 1 encerra a espera com 1s e o -c 2 emite apenas 2 pacotes ICMP. Ajuste conforme sua necessidade

Então, para percorrer toda a minha lista e apenas imprimir os IPs que não responderam, lançamos mão do xargs e do grep.


dig +short some.random.domain | \
  xargs -I{}  ping -w 1 -v -c 2 {} | \
  grep -B1 "0 received"
--- 192.168.10.20 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

O -B1 do grep nos permite mostrar a linha anterior ao resumo dos pacotes, já que o ping não coloca tudo na mesma linha.

segunda-feira, 27 de janeiro de 2025

Já Não Estou Aí

Um detalhe do filme Ainda Estou Aqui me colocou a pensar: a participação da trabalhadora doméstica Zezé.

As histórias da ditadura são quase sempre focadas em pessoas de classe média. É claro que a família Paiva sofreu muito, mas essas histórias já as conhecemos todas.

A Zezé vivia num quartinho de empregada dentro da casa dos Paiva. Isso chega a ser chocante: a estrutura social refletia ainda a escravidão: havia ali uma casa-grande e uma senzalinha.

A ditadura, não é óbvio para muitos, foi um movimento para impedir a modernização do Brasil. As reformas de base visavam preparar o país, que estava se urbanizando rapidamente, para a modernidade.

Esse freio provocou o crescimento desordenado das grandes cidades e jogou milhões de brasileiros na miséria urbana, sem moradia e sem educação. Mas além da violência por inação, a ditadura incentivou a violência policial nas periferias (Cidade de Deus é provavelmente o melhor filme sobre a ditadura) e deslocou milhares de nordestinos para ocupar as margens da rodovia transamazônica e lá os abandonou à própria sorte.

Eu não ignoro o sofrimento dos torturados, dos assassinados, e de suas famílias, mas a ditadura roubou o futuro de milhões de pessoas e essa história não é contada.

Essa classe média que se compadece com o sofrimento dos Paiva, faz alguma coisa para tornar o país mais justo? Um morador da periferia vive a violência todos os dias. Uma pessoa morta há 50 anos não vai comovê-lo. A polícia continua torturando e matando e a classe média aplaude.

A muito custo, os governos de esquerda conseguem umas vagas na universidade para negros, um dinheirinho para aliviar a fome dos mais necessitados, e reconhecer as uniões homoafetivas. Mudar realmente a matriz social do país, até hoje com marcas da escravidão, não inspira da mesma forma que a Comissão da Verdade inspira. No fundo, estamos só maquiando um porco.

Se formos a Brasília, poderemos ver faxineiras trocando o uniforme sob viadutos e um metrô que chega a centenas de metros do aeroporto e subitamente muda de direção. Nos ministérios não há lugar para a faxineira terceirizada trocar de roupa (quem dirá tomar um banho) e o transporte de massa não vai até o aeroporto, porque, obviamente, os trabalhadores não precisam ir até lá (sequer os que lá trabalham, aparentemente). A infraestrutura é pensada para separar.

Até hoje, apartamentos são construídos com o quarto da empregada.

Por não discutirmos essas coisas, temos uma classe popular que almeja tornar-se classe média e uma classe média que, em grande parte, quer manter a distância. Já ninguém imagina um país diferente.

Afinal, o que o filme agrega? Ele tem boas atuações e ele conta uma história interessante, mas ele não agrega nada à discussão e, no fundo, prega para convertidos. Talvez o Walter Salles tenha colocado a cena da Zezé em seu quartinho para provocar alguma reflexão. Pelo menos comigo, funcionou.

Ainda Estou Aqui recebeu três indicações ao Oscar. Sim, é bom ter um filme nacional reconhecido no mundo, mas nós precisamos dessa confirmação para saber que ele é bom? Nós realmente dependemos da confirmação da indústria que apoia a superestrutura e que convence nossos compatriotas de que lá é o centro do mundo e que aqui somos apenas coadjuvantes na periferia do mundo deles?

Alimentar esse auê sobre o Oscar, temo que apenas alimente a máquina de ilusões que sustenta nosso atraso através do filtro de histórias que devem ou não ser contadas.

E que fim levou a Zezé? Os filhos dela terão conseguido estudar num CIEP (sim, veja bem, fomos capazes de acabar com esse projeto mesmo em tempos democráticos)?

domingo, 26 de janeiro de 2025

Adeus, Windows.

Recentemente, passei vários dias e muitas horas tentando descobrir por que um laptop com Windows 10 falhava aleatoriamente com tela azul e um erro relacionado a drivers (KMODE Exception not handled).

O laptop possui um i5-2450M com 16GB de RAM. É uma boa máquina, com recursos mais que suficientes para as necessidades do dono. Curiosamente, entretanto, a CPU não está entre as aprovadas para o Windows 10.

Além disso, o Windows 11 não admite ser instalado nesse laptop.

Experimentei o Ubuntu Mate nessa máquina e tudo funcionou perfeitamente.

A minha única saída foi voltar para o Windows 7 e instalar as últimas versões do Chrome e do Firefox que ainda rodam nessa versão.

Eu estou acostumado a baixar arquivos .iso de Linux ou algum BSD, gravar com dd num pendrive e fazer o boot, mas o Windows não permite essa facilidade e exige que o .iso seja gravado no pendrive com um software, claro, específico do Windows.

Resolvi que não tenho mais tempo a perder com um software tão maligno que é projetado para tornar obsoletas máquinas perfeitamente úteis.

Se algum amigo ou parente pedir uma ajuda para instalar Linux ou qualquer BSD, eu o farei e essa será minha contribuição na luta contra os abusos do capitalismo tardio.

Instalar Windows, no entanto, nunca mais farei por ninguém.

A pessoa para quem eu estava dedicando meu tempo tem grande apego ao Excel. Eu pensei, então, que talvez fosse possível rodar o Excel no Linux com o Wine, porque, de qualquer forma, o Windows 7 é uma solução temporária: logo os navegadores estarão obsoletos. Pedi, então, a mídia de instalação do Office. Recebi uma mídia do Windows 10 e outra do Windows 7: "veja o que tem aí". Eu me senti um pouco ofendido e não foi a primeira vez que eu me deparei com um usuário que, apesar de insistir no Windows, transfere completamente o custo de configurar e manter o micro.

Usuários de Windows, via de regra, o são por pura inércia e por dependerem do trabalho de outros (remunerado ou não). Cansei disso. Eu escolhi o Linux pela liberdade que ele provê. Houve uma época em que usar o Linux exigia sacrifícios, mas essa época já passou. O sacríficio agora está em insistir com a empresa de Redmond.

segunda-feira, 14 de outubro de 2024

Webex com LXC

O Webex parou de funcionar no Ubuntu 22.04 quando eu atualizei o kernel e continuou dando problema quando fiz o upgrade para 24.04.

Ele inicia e até chega a rodar por uns minutos, mas acaba por encerrar sem dar nenhuma explicação. A comunicação não é mesmo o forte dele, porque ele não funciona no root, mas não indica nenhum motivo.

Sem muita esperança, resolvi experimentar rodar dentro de um contêiner LXC.

Vamos ao básico: instalar o LXD.


sudo snap install lxd
sudp lxd init

O init vai fazer um monte de perguntas. As respostas default servem.

Como vai ser preciso usar o X11 do hospedeiro, é preciso criar um profile. Primeiro, cria-se um arquivo gui.txt com essas configurações:


config:
  environment.DISPLAY: :0
  environment.PULSE_SERVER: unix:/home/ubuntu/pulse-native
  nvidia.driver.capabilities: all
  nvidia.runtime: "true"
  user.user-data: |
    runcmd: 
      - 'sed -i "s/; enable-shm = yes/enable-shm = no/g" /etc/pulse/client.conf'
    packages:
      - x11-apps
      - mesa-utils
      - pulseaudio
    write_files:
      - owner: root:root
        permissions: '0644'
        append: true
        content: |
          PULSE_SERVER=unix:/home/ubuntu/pulse-native
        path: /etc/environment
description: GUI LXD profile
devices:
  PASocket1:
    bind: container
    connect: unix:/run/user/1000/pulse/native
    listen: unix:/home/ubuntu/pulse-native
    security.gid: "1000"
    security.uid: "1000"
    uid: "1000"
    gid: "1000"
    mode: "0777"
    type: proxy
  X0:
    bind: container
    connect: unix:@/tmp/.X11-unix/X1
    listen: unix:@/tmp/.X11-unix/X0
    security.gid: "1000"
    security.uid: "1000"
    type: proxy
  mygpu:
    type: gpu
name: x11
used_by: []

Com isso, podemos criar um profile e, finalmente, um contêiner (como root):


lxc profile create gui
cat gui.txt | lxc profile edit gui
lxc launch --profile default --profile gui ubuntu:22.04 jammy

Jammy vai ser o nome do nosso contêiner. Pode ser que o launch falhe inicialmente, mas o start o coloca de pé novamente:


lxc start jammy

Agora temos que criar um user, copiar o Webex.deb para dentro do contêiner, instalar e, finalmente, rodar:


xhost +
sudo lxc file push Webex.deb jammy/
sudo lxc exec jammy bash
# dentro do contêiner
cd /
apt install /Webex.deb
adduser armando
su armando
# como armando
export DISPLAY=:0
/opt/Webex/bin/CiscoCollabHost %U

Como o usuário armando foi criado depois, precisamos pegar o seu id e editar algumas linhas no profile para que o áudio funcione. Como é o primeiro usuário criado, ele ficou com o id 1001.


name: gui
description: GUI LXD profile
config:
  environment.DISPLAY: :0
  environment.PULSE_SERVER: unix:/home/armando/pulse-native
  nvidia.driver.capabilities: all
  nvidia.runtime: "true"
  user.user-data: |
    runcmd:
      - 'sed -i "s/; enable-shm = yes/enable-shm = no/g" /etc/pulse/client.conf'
    packages:
      - x11-apps
      - mesa-utils
      - pulseaudio
    write_files:
      - owner: root:root
        permissions: '0644'
        append: true
        content: |
          PULSE_SERVER=unix:/home/armando/pulse-native
        path: /etc/environment
devices:
  PASocket1:
    bind: container
    connect: unix:/run/user/1000/pulse/native
    gid: "1001"
    listen: unix:/home/armando/pulse-native
    mode: "0777"
    security.gid: "1000"
    security.uid: "1000"
    type: proxy
    uid: "1001"
  X0:
    bind: container
    connect: unix:@/tmp/.X11-unix/X1
    listen: unix:@/tmp/.X11-unix/X0
    security.gid: "1000"
    security.uid: "1000"
    type: proxy
  mygpu:
    type: gpu
used_by:
- /1.0/instances/jammy


Após editar o profile, é preciso parar e iniciar novamente o contêiner.


sudo lxc profile edit gui
sudo lxc stop jammy
sudo lxc start jammy

Para executar rapidamente o webex, pode-se criar um .sh com um comando assim:


sudo lxc exec jammy -- su -c ./webex.sh -l armando

E dentro do contêiner, em /home/armando, um outro webex.sh com esses comandos (já citados acima):


export DISPLAY=:0
/opt/Webex/bin/CiscoCollabHost %U

E com isso pode-se quebrar um galho enquanto a Cisco não atualiza o software.