<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>TRILUX</title>
	<atom:link href="https://trilux.org/feed.xml" rel="self" type="application/rss+xml" />
	<link>https://trilux.org/</link>
	<description>Um blog pessoal, a esta altura do campeonato!</description>
	<lastBuildDate>Sun, 01 Feb 2026 11:53:28 -0300</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://augustocampos.net/</generator>
		<item>
		<title><![CDATA[Rigidez cognitiva no autismo: como funciona pra mim]]></title>
		<link>https://trilux.org/2026/02/rigidez-cognitiva-no-autismo-como-funciona-pra-mim.html</link>
		<pubDate>Sun, 01 Feb 2026 11:53:27 -0300</pubDate>
		<dc:creator><![CDATA[Augusto Campos]]></dc:creator>
		<description><![CDATA[Essa imagem exprime muito bem como funciona, em mim, a rigidez cogniva que é parte do meu autismo.]]></description>
		<content:encoded><![CDATA[<p>Essa imagem exprime muito bem como funciona, em mim, a rigidez cogniva que é parte do meu autismo.</p>
<p><figure><br />
	<img alt="Foto mostra, ao longe, uma pessoa de caiaque sobre um lago cuja superfície está congelada. Atrás dela há o rastro do caiaque e a marca dos pontos em que as remadas romperam a superfície de gelo." src="https://static.efetividade.net/img/1f74c19f78473d1c-27272.jpeg"><br />
	<figcaption>Uma pessoa de caiaque sobre um lago cuja superfície está congelada. Atrás dela há o rastro do caiaque e a marca dos pontos em que as remadas romperam a superfície de gelo.</figcaption><br />
</figure></p>
<p>Se tá na hora de andar de caiaque, tá na hora de andar de caiaque, e não importa se o lago congelou, ou o que a Britney anda fazendo na hípica.</p>
<hr>
<p>(eu postei bem mais detalhes sobre <a href="https://trilux.org/2025/03/como-e-ter-autismo-mais-um-exemplo-de-como-funciona-para-mim.html">dois exemplos de como a rigidez cognitiva se manifesta em mim</a>, anteriormente)</p>
<p style="margin-top:1.5em; border-top:1px solid #d0d0d0;padding-top:0.3em;"><i>O artigo "<a href="https://trilux.org/2026/02/rigidez-cognitiva-no-autismo-como-funciona-pra-mim.html">Rigidez cognitiva no autismo: como funciona pra mim</a>" foi originalmente publicado no site <a href="https://trilux.org/">TRILUX</a>, de <a href="https://augustocampos.net/">Augusto Campos</a>.</i></p>]]></content:encoded>					
		</item>
		<item>
		<title><![CDATA[Aprender alemão é fácil, juro]]></title>
		<link>https://trilux.org/2026/02/aprender-alemao-e-facil-juro.html</link>
		<pubDate>Sun, 01 Feb 2026 11:26:32 -0300</pubDate>
		<dc:creator><![CDATA[Augusto Campos]]></dc:creator>
		<description><![CDATA[(desconheço o autor, mas era esse tipo de historinha que circulava na Internet brasileira lá por 1995)  Aprender alemão é fácil  A língua alemã é relativamente fácil.]]></description>
		<content:encoded><![CDATA[<p>(desconheço o autor, mas era esse tipo de historinha que circulava na Internet brasileira lá por 1995)</p>
<p>Aprender alemão é fácil</p>
<p>A língua alemã é relativamente fácil. Quem sabe algum idioma clássico e está habituado com as declinações, pode aprendê-la sem grandes dificuldades — ao menos é o que os professores de Alemão dizem em suas primeiras aulas.</p>
<p>Em seguida, quando começamos a estudar os der, des, den, dem, die, eles dizem que é moleza: tudo é apenas uma questão de lógica. Realmente é muito simples; podemos ver isso no exemplo que passamos a examinar.</p>
<p>Tomemos um honesto livro alemão: um volume magnífico, encadernado em couro, publicado em Dortmund, que descreve os usos e costumes dos hotentotes (em Alemão, hottentotten).</p>
<p>O livro nos conta que os cangurus (Beutelratten) são capturados e colocados em jaulas (Kotter) cobertas de um tecido (Lattengitter), para abrigá-los do mau tempo. Essas jaulas são chamadas, em Alemão, "jaulas cobertas de tecido" (Lattengitterkotter); assim que botam um canguru dentro delas, ele é chamado Lattengitterkotterbeutelratten, "o canguru da jaula coberta de tecido".</p>
<p>Um dias os hotentotes capturaram um assassino (Attentater), acusado de ter matado uma mãe (Mutter) hotentote - Hottentottermutter -, que tinha um filho tonto e gago (stottertrottel). Essa pobre mãe se chama, em Alemão, Hottentottenstottertrottelmutter, e seu assassino é chamado de Hottentottenstottertrottelmutterattentater. A polícia prendeu o assassino e o enfiou provisoriamente numa gaiola de canguru (Beutelrattenlattengitterkotter), mas o prisioneiro escapou. As buscas mal tinham começado, quando surgiu um guerreiro hotentote, gritando:</p>
<p>— Capturei o assassino! (Attentater).</p>
<p>— Sim? Qual? — perguntou o chefe.</p>
<p>— O Lattengitterkotterbeutelratterattentater! — respondeu o guerreiro.</p>
<p>— Como assim? O assassino que estava na jaula de cangurus coberta de tecido? — perguntou o chefe dos hotentotes.</p>
<p>— É, sim, é o Hottentottenstottertrottelmutteratentater (o assassino da mãe hotentote de um menino tonto e gago) — respondeu o nativo.</p>
<p>- Ora , respondeu o chefe, poderias ter me dito desde o início que tinhas capturado o Hottentotterstottertrottelmutterlattengitterkotterbeutelrattenattentater.</p>
<p>Como dá para ver, o Alemão é uma língua fácil; basta a gente se interessar um pouquinho...</p>
<p style="margin-top:1.5em; border-top:1px solid #d0d0d0;padding-top:0.3em;"><i>O artigo "<a href="https://trilux.org/2026/02/aprender-alemao-e-facil-juro.html">Aprender alemão é fácil, juro</a>" foi originalmente publicado no site <a href="https://trilux.org/">TRILUX</a>, de <a href="https://augustocampos.net/">Augusto Campos</a>.</i></p>]]></content:encoded>					
		</item>
		<item>
		<title><![CDATA[Programando bots para o Mastodon: identificando instâncias brasileiras]]></title>
		<link>https://trilux.org/2026/01/programando-bots-para-o-mastodon-identificando-instancias-brasileiras.html</link>
		<pubDate>Sat, 10 Jan 2026 18:17:00 -0300</pubDate>
		<dc:creator><![CDATA[Augusto Campos]]></dc:creator>
		<description><![CDATA[Hoje veremos como criar scripts que buscam as informações de identificação de uma instância, e de que forma é possível identificar se ela é brasileira – ou, no mínimo, se suas informações estão em português.]]></description>
		<content:encoded><![CDATA[<h2 class="mylead">Hoje veremos como criar scripts que buscam as informações de identificação de uma instância, e de que forma é possível identificar se ela é brasileira – ou, no mínimo, se suas informações estão em português.</h2>
<p>O meu script de censo do Fediverso BR é executado aproximadamente uma vez por ano. Ele percorre as dezenas de milhares (mais de 100.000, neste momento) de servidores federados, buscando <mark>identificar quais correspondem a instâncias brasileiras, e quais as tendências em relação a elas</mark>.</p>
<p>Eu resisto a compartilhá-lo, porque como envolve mais de 100.000 servidores, <mark>eu não quero contribuir gerar ainda mais demandas e custos aos seus admins</mark>, ao facilitar que um monte de gente rode scripts que os contatem indiscriminadamente.</p>
<h2>Compartilhando só a lógica central</h2>
<p>Neste final de semana eu estou rodando essa rotina novamente (a vez anterior foi em fevereiro de 2025), e o <a href="https://bolha.us/@josir#.">Josir Gomes</a> voltou a me pedir pra compartilhar o script. Eu tenho certeza de que a intenção dele é boa, pois sei que ele é pesquisador sobre esse tema, e que seu interesse (assim como o de outros pesquisadores e interessados) é legítimo. </p>
<p><figure><br />
	<img alt="Uma lupa ampliando um fragmento do símbolo do Fediverso" src="https://static.efetividade.net/img/fedisearch-11184-58249.png"><br />
</figure></p>
<p>Por isso,decidi compartilhar (só) o filé mignon do meu script: as rotinas que obtém os dados sobre um servidor, e a descrição do método que uso para identificar se são brasileiros (ou lusófonos, dependendo do critério). Ao final, faço um pedido especial de responsabilidade ao usar as técnicas aqui descritas.</p>
<p>Importante: Para rodar os scripts abaixo, você precisa ter uma shell Bash ou compatível, com o awk e o <a href="https://trilux.org/2023/03/gron-consuma-apis-da-web-jquery-usando-filtros-do-unix.html">gron</a> (para facilitar o consumo das respostas em formato JSON), instalados em um sistema compatível com o Posix (como a maior parte das distribuições Linux, o Mac e Unix em geral). Não incluirei as explicações detalhadas, mas todos os mecanismos que usei hoje já estão explicados no post anterior: “<a href="https://trilux.org/2025/12/programando-bots-para-o-mastodon-listando-usuarios-via-api.html">Programando bots para o Mastodon: listando usuários via API</a>” (e nos seus antecessores)</p>
<p><q>Hoje veremos um método baseado no ActivityPub, e outro que usa especificamente a API do Mastodon.</q></p>
<p>Quase todos os serviços on-line interativos conectados ao Fediverso respondem a chamadas básicas de identificação "<a href="https://nodeinfo.diaspora.software">NodeInfo</a>", que estão definidas no protocolo ActivityPub, e um grande número deles também responde a chamadas bem mais detalhadas que fazem parte do protocolo Mastodon (com o qual vários outros serviços são compatíveis).</p>
<p>Veremos hoje como identificar um servidor a partir de cada uma das duas chamadas de identificação acima: a básica (do ActivityPub) e a detalhada (do Mastodon e seus compatíveis).</p>
<p>Usarei a minha própria instância (arram.senta-la.cloud) nos exemplos, mas você pode substituir pela que desejar consultar.</p>
<h2>Identificação básica usando o ActivityPub</h2>
<p>Como dito, o tipo de identificação "<a href="https://nodeinfo.diaspora.software">NodeInfo</a>" funciona na grande maioria dos servidores interativos conectados ao Fediverso (incluindo Mastodon, Misskey, Lemmy, GoToSocial, Snac, Ghost, WordPress e mais), e ela tem 2 passos: (1) obter qual a URL de informações do servidor; e (2) obter as informações do servidor.</p>
<p>Passo 1. Para obter a URL de informações do servidor, é necessário consultar a sua url <code>/.well-known/nodeinfo</code>, como no exemplo:</p>
<pre><code><strong>gron "https://arram.senta-la.cloud/.well-known/nodeinfo"</strong>
json = {};
json.links = [];
json.links[0] = {};
json.links[0].href = "https://arram.senta-la.cloud/nodeinfo/2.0";
json.links[0].rel = "http://nodeinfo.diaspora.software/ns/schema/2.0";
</code></pre>
<p>Na listagem acima, o comando que eu digitei na shell interativa está em negrito, e as demais linhas são a resposta recebida. A linha que nos interessa é a penúltima, que define o href do link. </p>
<p>No exemplo acima, portanto, descobrimos que a URL de informações do servidor é <code>https://arram.senta-la.cloud/nodeinfo/2.0</code>. Agora que a conhecemos, podemos consultá-la também: </p>
<pre><code><strong>gron "https://arram.senta-la.cloud/nodeinfo/2.0"</strong>
json = {};
json.metadata = {};
json.metadata.nodeDescription = "arram.senta-la.cloud - A instância das trends, tags, efemérides e estatísticas no Fediverso BR. Bem-vindos à federação!";
json.metadata.nodeName = "Arram, senta lá, Cloud!";
json.openRegistrations = false;
json.protocols = [];
json.protocols[0] = "activitypub";
(...)
</code></pre>
<p>Novamente, o comando que eu digitei na shell interativa está em negrito, e as demais linhas são o início da resposta recebida, que eu cortei pois é extensa.</p>
<p>Note que as linhas retornadas apresentam várias informações sobre a minha instância, que roda o serviço Mastodon. </p>
<p>Para outros serviços (mesmo que sejam compatíveis com o Mastodon), os nomes dos atributos serão os mesmos, mas podem ser retornadas outros atributos (a menos, ou a mais) – por exemplo, se você inspecionar uma instância PeerTube, ela também retornará os formatos e resoluções de vídeo que ela suporta, e se você consultar uma instância Sharkey, ela retornará também o contato de seu admin (que o Mastodon não retorna nessa chamada).</p>
<p>O script a seguir realiza as duas consultas à minha instância e mostra o conteúdo de alguns atributos selecionados (que não necessariamente todas as instâncias retornarão ao responder a essa chamada):</p>
<pre><code>
#!/usr/bin/env bash
#
# instinfo_AP.sh - obtém via ActivityPub informações sobre uma instância
#
# Copyright (c) 2026,  Augusto Campos (https://augustocampos.net/).
# Licensed under the Apache License, Version 2.0.
#

inst="https://arram.senta-la.cloud"
INFO_URL=&#36;(curl -sL "&#36;inst/.well-known/nodeinfo" | 
	gron | awk -F&#39; = &#39; &#39;/href/ {print &#36;2}&#39; | tr -d &#39;";&#39; | head -n 1)
	
curl -sL "&#36;INFO_URL" | gron | awk -F&#39; = &#39; &#39;
/[.]nodeName/ {print "nome",&#36;2}
/[.]nodeDescription/ && !/rules/ {print "descrição",&#36;2}
/[.]software[.]name/ {print "sistema",&#36;2}
/[.]software[.]version/ {print "versão",&#36;2}
/[.]usage[.]users[.]total/ {print "usuários cadastrados",&#36;2}
/[.]usage[.]users[.]activeMonth/ {print "usuários ativos",&#36;2}
/[.]usage[.]localPosts/ {print "posts",&#36;2}
&#39;
</code></pre>
<p>Note que no script acima são feitos dois acessos ao servidor: o primeiro é para descobrir qual a URL de informações, e o segundo para consultá-la, retornando a seguir o conteúdo de alguns de seus atributos: o nome e descrição da instância, o nome e versão do software que está rodando nela, e algumas estatísticas básicas.</p>
<p>Nem todo servidor responde a essa chamada, mas ela funciona com a ampla maioria deles.</p>
<p>Se desejar, você pode modificar o script para tornar parametrizável, suportar mais (ou outros) atributos, e incluir tratamento de erro, por exemplo.</p>
<h2>Identificação mais ampla usando a API do Mastodon</h2>
<p>Além do próprio Mastodon, vários outros serviços do Fediverso (como o Snac, GoToSocial, WordPress e muitos outros) respondem a chamadas da API do Mastodon, de uma forma similar à que vimos acima, mas às vezes retornando mais informações.</p>
<p>Diferente do caso que vimos acima, fazer a consulta pela API do Mastodon envolve apenas uma chamada ao servidor, pela sua URL <code>/api/v1/instance</code>, como no exemplo:</p>
<pre><code><strong>gron "https://arram.senta-la.cloud/api/v1/instance"</strong>
json = {};
json.approval_required = false;
json.short_description = "arram.senta-la.cloud - A instância das trends, tags, efemérides e estatísticas no Fediverso BR. Bem-vindos à federação!";
json.stats = {};
json.stats.domain_count = 11027;
json.stats.status_count = 15863;
json.stats.user_count = 9;
json.title = "Arram, senta lá, Cloud!";
json.uri = "arram.senta-la.cloud";
json.version = "4.5.4";
</code></pre>
<p>Mais uma vez, o comando que eu digitei na shell interativa está em negrito, e as demais linhas são partes da resposta recebida, que eu cortei pois é extensa.</p>
<p>Ao fazer essa chamada a um servidor Mastodon, a resposta trará várias dezenas de atributos, descrevendo a instância, todas as suas regras, os detalhes sobre a conta de seu admin, a sua política quanto a aceitar ou não novas contas, quantos caracteres podem ter os seus posts, quantas alternativas podem ter as suas enquetes, e mais.</p>
<p>Novamente, ao fazermos a mesma chamada a outros tipos de servidores (compatíveis, mas que não estejam rodando o software Mastodon), os atributos terão os mesmos nomes, mas o conjunto pode ser diferente – por exemplo, uma instância Sharkey pode não retornar detalhes sobre seu admin, e uma instância Snac pode não listar suas regras.</p>
<p>O script a seguir realiza a consulta à minha instância e mostra o conteúdo de alguns atributos selecionados (que não necessariamente todas as instâncias compatíveis retornarão ao responder a essa chamada):</p>
<pre><code>
#!/usr/bin/env bash
#
# instinfo_MAS.sh - obtém via API Mastodon informações sobre uma instância
#
# Copyright (c) 2026,  Augusto Campos (https://augustocampos.net/).
# Licensed under the Apache License, Version 2.0.

inst="https://arram.senta-la.cloud"
curl -sL "&#36;inst/api/v1/instance" | gron | awk -F" = " &#39;
	/[.]title/ { print "título",&#36;2 }
	/[.](short_)?description/ { print "descrição",&#36;2 }
	/[.]languages\[/ { print "idioma",&#36;2 }
	/[.]contact_account[.]display_name/ { print "admin - nome",&#36;2 }
	/[.]contact_account[.]note/ { print "admin - nota",&#36;2 }
	/[.]contact_account[.]url/ { print "admin - url",&#36;2 }
	/[.]rules\[[0-9]+\][.](text|hint)/ {
		gsub(/[";]/, "", &#36;2);
		regras = regras "  - " &#36;2
	}
	END { if (regras) print "regras",regras }
&#39;
</code></pre>
<p>O script consulta a instância e retorna o conteúdo de alguns de seus atributos: o título e descrição da instância, idiomas visíveis na API, alguns detalhes sobre o admin, e o texto das regras (sem formatação).</p>
<p>Esses atributos foram escolhidos porque demonstram (se você testar com outras instâncias) que a resposta de outros serviços são diferentes das do Mastodon: por exemplo, testei com uma instância Misskey e, da lista acima, ela retornou apenas título e descrição. Testei com Snac e veio quase tudo, mas não as regras. E assim por diante.</p>
<p>Só os servidores compatíveis com a API do Mastodon (versão 1) respondem a essa chamada.</p>
<p>Se desejar, você pode modificar o script para tornar parametrizável, suportar mais (ou outros) atributos, formatar texto e incluir tratamento de erro, por exemplo.</p>
<h2>E como identificar se o servidor é brasileiro?</h2>
<p>Dependendo do seu interesse, essa pode ser a pergunta de um milhão de dólares, e infelizmente não tem resposta direta, porque depende inclusive de definir o que significa o servidor ser brasileiro: é estar hospedado no Brasil? Ter admin brasileiro? Ter maioria de usuários brasileiros? Ter maioria de posts originados em português?</p>
<p>A minha abordagem geral para essa pergunta é identificar se o servidor ou a conta do seu admin são descritos em português, e aí (caso eu esteja procurando por servidores brasileiros, e não mais amplamente por servidores lusófonos) excluir da lista os servidores que possam ser identificados como sendo de outros países.</p>
<p>Dependendo do caso, os próprios protocolos oferecem informações sobre o idioma dos textos - no exemplo acima da chamada da API do Mastodon, eu incluí o acesso ao atributo "language", inclusive. Infelizmente isso ajuda pouco, porque é muito frequente essa informação estar errada ou incompleta - e ela não distingue entre o português brasileiro, o europeu e o da África.</p>
<p>Para lidar com isso, eu uso uma heurística, ou regra de padeiro, em que reúno todos os textos retornados pela API nas chamadas acima (a descrição da instância, suas regras, a mensagem sobre autorização pra criar novas contas, os detalhes da conta do admin, e até as URLs), e procuro neles algumas caraterísticas comuns nesses textos quando se trata de instâncias brasileiras, como por exemplo:</p>
<ul>
<li>endereços que terminem com .br
<li>menções a Brasil ou Brazil, a português ou a portuguese, ou a pt_BR ou 🇧🇷.
<li>palavras como instância, comunidade, bem-vind, moderad, proibid, língua, regra, saiba
<li>palavras como você, aqui, também, não
<li>sufixos como ão, ões, inho, inha, ça, ço
</ul>
<p>Aplicar esse filtro é bastante eficaz, mas traz junto vários falsos positivos em italiano, francês, alemão, inglês, espanhol e galego (sendo que este último às vezes eu não desejo excluir, porque é uma língua tão próxima da nossa). </p>
<p>Antes de inspecionar manualmente, eu aplico um filtro que é eficaz para identificar a maior parte dos falsos positivos (i. e. servidores não-lusófonos identificados como brasileiros):</p>
<ul>
<li>palavras como cuenta, (y|el|los|las), de la, de lo, (un|el) servidor, serán, ningún
<li>palavras como información, hispano, contenido, habla, bienvenid, aplicables, proyecto
<li>palavras como kommen kontakt, réseau, communiquez, votre
<li>palavras como avéc, vous, lo, di, uno, unha, zum, wie, und, ein, zu, von
</ul>
<p>Note que as listas de palavras acima foram geradas empiricamente e a partir das estatísticas dos servidores reais do Fediverso, e podem não se aplicar a outros domínios.</p>
<h2>Um pedido especial</h2>
<p>A partir dos 2 scripts acima, e da heurística de identificação de origem/idioma, é possível implementar sistemas de coleta e análise de dados que responderão a questões interessantes sobre o Fediverso, e é por essa razão que eu os compartilho.</p>
<p>Porém, o Fediverso é composto de várias dezenas de milhares de servidores, muitos dos quais mantidos por voluntários que incorrem em custos de CPU e de tráfego. Respeite-os, não gere rotinas que os consultem com frequência exagerada, que os demandem de forma que os onere, e muito menos que tentem obter deles dados em desacordo com as suas políticas, termos e expectativas de privacidade.</p>
<p>Para saber mais sobre as ferramentas e técnicas aqui mencionadas, consulte os posts da <a href="mastodon">tag Mastodon</a> do meu blog.</p>
<p style="margin-top:1.5em; border-top:1px solid #d0d0d0;padding-top:0.3em;"><i>O artigo "<a href="https://trilux.org/2026/01/programando-bots-para-o-mastodon-identificando-instancias-brasileiras.html">Programando bots para o Mastodon: identificando instâncias brasileiras</a>" foi originalmente publicado no site <a href="https://trilux.org/">TRILUX</a>, de <a href="https://augustocampos.net/">Augusto Campos</a>.</i></p>]]></content:encoded>					
		</item>
		<item>
		<title><![CDATA[Conversas boas são jogos de frescobol, não de tênis]]></title>
		<link>https://trilux.org/2026/01/conversas-boas-sao-jogos-de-frescobol-nao-de-tenis.html</link>
		<pubDate>Tue, 06 Jan 2026 10:14:11 -0300</pubDate>
		<dc:creator><![CDATA[Augusto Campos]]></dc:creator>
		<description><![CDATA[Uma conversa leve é como um jogo de frescobol: o objetivo é manter a bolinha no ar, contribuindo para não fazer a outra pessoa derrubá-la.]]></description>
		<content:encoded><![CDATA[<h2 class="mylead">Uma conversa leve é como um jogo de frescobol: o objetivo é manter a bolinha no ar, contribuindo para não fazer a outra pessoa derrubá-la.</h2>
<p>Observando a chegada de várias centenas de novas pessoas a uma rede social desde a virada do ano, notei a repetição de padrões que já vi acontecerem, muitas vezes antes, nas tentativas de se enturmar. </p>
<p><q>Sou um observador de técnicas de conversação, pois o TEA sempre me demanda atenção extra à comunicação.</q></p>
<p>Alguns desses padrões funcionam, outros não - e eu observo isso do ponto de vista de alguém sempre atento a esse tema, pois o TEA me demanda atenção extra à comunicação.</p>
<p>O negócio é que uma conversa realmente boa é similar a uma partida de frescobol, em que <mark>lançamos a nossa contribuição de tal forma que o outro participante possa lançar também a dele, na expectativa de continuidade, com contribuição de ambas as partes</mark>, que não são adversárias entre si.</p>
<p><figure><br />
<img src="https://static.efetividade.net/img/frescobolcapawidelg-93227.jpg"><br />
</figure></p>
<p>Assim, tenho duas sugestões a quem quer se enturmar e ter boas conversas nas redes (e, igualmente, fora delas):</p>
<p>1. <strong>Ao responder,</strong> comece concordando ou discordando explicitamente. Ideal: comece com "Sim! Além disso…"<sup><a title="“Sim, e...”, é uma dica extraída da comédia de improvisação (ou improv), que sugere que, para manter a cena rodando, um participante deve aceitar o que outro improvisador declarou (“sim”) e, em seguida, expandir a sua linha de pensamento (“e...”)." name="ret-1_conversas-boas-sao-jogos-de-frescobol-nao-de-tenis"class=rodape_link href="#1_conversas-boas-sao-jogos-de-frescobol-nao-de-tenis">1</a></sup></p>
<p>2. <strong>Pra puxar conversa,</strong> não responda a uma afirmação com uma pergunta. Exponha uma posição, e deixe as outras pessoas livres sobre como prosseguir. ESPECIALMENTE se estiver fazendo uma tentativa de humor.</p>
<p>Tende a dar mais certo se você deixar a outra pessoa livre para interagir como preferir (sem tentar colocá-la numa posição em que ela esteja sendo entrevistada ou chamada a confirmar, justificar ou refutar algo).</p>
<p>Pra manter a analogia, lembre-se que é completamente diferente de um debate de oponentes, que é como uma partida de tênis em que cada lado deseja lançar seu argumento para a quadra oposta, na expectativa de que o oponente não consiga lançar outro de volta.</p>
<p>Assim, se você perceber que está levantando a bola para o outro cortar contra você, aí a técnica simplesmente não funciona, e não vale a pena insistir nela, nem mencioná-la – e talvez nem seja possível ter uma conversa agradável sobre esse assunto, com essa pessoa, nesse momento.</p>
<div id="rodapes">
<div id="rodapes_halfline">&nbsp;</div>
<ol>
<li><a class=rodape_numero name="1_conversas-boas-sao-jogos-de-frescobol-nao-de-tenis">&nbsp;</a>“Sim, e...”, é uma dica extraída da comédia de improvisação (ou improv), que sugere que, para manter a cena rodando, um participante deve aceitar o que outro improvisador declarou (“sim”) e, em seguida, expandir a sua linha de pensamento (“e...”). <a href="#ret-1_conversas-boas-sao-jogos-de-frescobol-nao-de-tenis">↩</a></p>
</ol>
</div>
<p><!--id-rodapes--></p>
<p style="margin-top:1.5em; border-top:1px solid #d0d0d0;padding-top:0.3em;"><i>O artigo "<a href="https://trilux.org/2026/01/conversas-boas-sao-jogos-de-frescobol-nao-de-tenis.html">Conversas boas são jogos de frescobol, não de tênis</a>" foi originalmente publicado no site <a href="https://trilux.org/">TRILUX</a>, de <a href="https://augustocampos.net/">Augusto Campos</a>.</i></p>]]></content:encoded>					
		</item>
		<item>
		<title><![CDATA[Loteria não é investimento]]></title>
		<link>https://trilux.org/2026/01/loteria-nao-e-investimento.html</link>
		<pubDate>Sat, 03 Jan 2026 19:06:45 -0300</pubDate>
		<dc:creator><![CDATA[Augusto Campos]]></dc:creator>
		<description><![CDATA[Esses caras que gastaram milhões em bilhetes da mega da virada se achando espertões, na intenção de ganhar um bilhão – e no fim das contas fizeram só meia dúzia de quadras –, sublinham mais uma vez: jogo não é investimento.]]></description>
		<content:encoded><![CDATA[<p>Esses caras que gastaram milhões em bilhetes da mega da virada se achando espertões, na intenção de ganhar um bilhão – e no fim das contas fizeram só meia dúzia de quadras –, sublinham mais uma vez: jogo não é investimento.</p>
<p>Eu ocasionalmente jogo na mega, mas… é jogo. As probabilidades estão totalmente contra mim. A chance de ganhar o maior prêmio é parecida com a de jogar pro alto o valor do bilhete, e cair uma fortuna no meu pé.</p>
<p>Inclusive é chato estar em bolão com gente que acha que está investindo.</p>
<p style="margin-top:1.5em; border-top:1px solid #d0d0d0;padding-top:0.3em;"><i>O artigo "<a href="https://trilux.org/2026/01/loteria-nao-e-investimento.html">Loteria não é investimento</a>" foi originalmente publicado no site <a href="https://trilux.org/">TRILUX</a>, de <a href="https://augustocampos.net/">Augusto Campos</a>.</i></p>]]></content:encoded>					
		</item>
		<item>
		<title><![CDATA[Iniciando 2026 com uma leveza em especial]]></title>
		<link>https://trilux.org/2026/01/iniciando-2026-com-uma-leveza-em-especial.html</link>
		<pubDate>Sat, 03 Jan 2026 19:04:28 -0300</pubDate>
		<dc:creator><![CDATA[Augusto Campos]]></dc:creator>
		<description><![CDATA[No primeiro dia do ano eu abri as caixas dos papeis que eram do meu pai, que se foi há pouco mais de 5 anos, pra separar o que ainda precisa ser guardado (por valor pessoal) e o que já podia ser descartado (por ter sido guardado por eventual]]></description>
		<content:encoded><![CDATA[<p>No primeiro dia do ano eu abri as caixas dos papeis que eram do meu pai, que se foi há pouco mais de 5 anos, pra separar o que ainda precisa ser guardado (por valor pessoal) e o que já podia ser descartado (por ter sido guardado por eventual razão tributária).</p>
<p>Certeza que foi a coisa mais difícil e extenuante que fiz nos últimos meses. Fiquei totalmente exausto, e precisei tomar um longo banho pra esvaziar até os pensamentos.</p>
<p>Mas antes do banho, levei tudo pro ponto de reciclagem, e abri espaço pro ano assim poder começar mais leve. Estou satisfeito.</p>
<p style="margin-top:1.5em; border-top:1px solid #d0d0d0;padding-top:0.3em;"><i>O artigo "<a href="https://trilux.org/2026/01/iniciando-2026-com-uma-leveza-em-especial.html">Iniciando 2026 com uma leveza em especial</a>" foi originalmente publicado no site <a href="https://trilux.org/">TRILUX</a>, de <a href="https://augustocampos.net/">Augusto Campos</a>.</i></p>]]></content:encoded>					
		</item>
		<item>
		<title><![CDATA[Resolução de ano novo]]></title>
		<link>https://trilux.org/2025/12/resolucao-de-ano-novo.html</link>
		<pubDate>Sun, 28 Dec 2025 10:54:09 -0300</pubDate>
		<dc:creator><![CDATA[Augusto Campos]]></dc:creator>
		<description><![CDATA[O natal me trouxe um monitor maior, e pro ano novo eu troquei a configuração (e as teclinhas) do teclado, e mudei o Plex pelo Emby como solução pra clips, shows, séries e filmes.]]></description>
		<content:encoded><![CDATA[<h4>O natal me trouxe um monitor maior, e pro ano novo eu troquei a configuração (e as teclinhas) do teclado, e mudei o Plex pelo Emby como solução pra clips, shows, séries e filmes.</h4>
<p>Estamos no último domingo antes da virada de 2025 para 2026, e a minha estação de trabalho hoje está assim:</p>
<p><figure><br />
	<img alt="Foto do meu ambiente de trabalho, com 2 monitores lado a lado, uma telinha menor acima de um deles tocando um clip de rock dos anos 80, e um teclado de 84 teclas com teclinhas em uma combinação de cores chamada Rome. Ao lado, uma garrafa de água e um elefante de pelúcia." src="https://static.efetividade.net/img/b3dd62216d8d42a9-13992-63162.png"><br />
	<figcaption>Meu ambiente de trabalho no final de dezembro de 2025</figcaption><br />
</figure></p>
<p>Já faz 20 anos que eu uso 2 monitores lado a lado, e a novidade principal veio como meu presente de natal pra mim mesmo: o monitor maiorzão, à esquerda, um LG 32UR500 com resolução de 3840x2160, porque trabalho com cada vez mais janelas abertas, ao contrário do que desejaria.</p>
<p>A terceira tela, bem menor e acima, não fica conectada ao mesmo computador que as outras duas. Ela é independente, e serve apenas para ficar tocando clips e shows musicais enquanto eu trabalho. </p>
<p>Essa telinha menor também tem novidade, porque após passar vários anos usando o Plex (nela e no servidor de mídia da casa), aproveitei a virada do ano pra fazer a troca do Plex pelo <a href="https://emby.media/">Emby</a>, e estou satisfeitíssimo – coisa que já há algum tempo eu não podia dizer sobre o Plex, que vinha ficando cada vez mais antipático.</p>
<p><figure><br />
	<img alt="Print de uma coleção de mídia chamada Séries Platinum, contendo 26 itens, com nomes como Wednesday, Taken, Pernalonga, Mad About You e Derry Girls" src="https://static.efetividade.net/img/8524394166607c68-png-800-40236.jpg"><br />
	<figcaption>Print de uma tela do Emby mostrando uma coleção de séries</figcaption><br />
</figure></p>
<p>Eu testei Emby, Jellyfin e Kodi, e o Emby foi o que chegou mais perto do ponto de equilíbrio que eu curto entre flexibilidade e facilidade, e de ter suporte nativo nas plataformas em que eu quero usar pra assistir.</p>
<p>Migrar minha biblioteca de shows, clips, séries e filmes do Plex para o Emby foi bem fácil, e aproveitei pra reorganizar algumas coisas na coleção. Uma coisa que eu consegui fazer com facilidade no Emby e não conseguia no Plex<sup><a title="O Plex oferecia um recurso parecido nas suas smart playlists, mas não era exatamente o que eu queria." name="ret-1_resolucao-de-ano-novo"class=rodape_link href="#1_resolucao-de-ano-novo">1</a></sup>, foi colocar um script na crontab pra, todos os dias às 4 da manhã, gerar uma playlist com 200 clips da minha coleção (a coleção tem 900+ clips), selecionados aleatoriamente entre os 500 que estão há mais tempo sem serem assistidos, para ter diariamente uma programação variada.</p>
<p><figure><br />
	<img alt="Um jogo de teclas chamado Rome, com teclas em cor preta, e algumas em cor creme e cor vinho, gerando um contraste meio vintage. As teclas estão soltas e espalhadas, em ordem, sobre uma mesa." src="https://static.efetividade.net/img/6d089a8aead57e51-png-800-61675.jpg"><br />
	<figcaption>Minhas teclinhas novas para 2026</figcaption><br />
</figure></p>
<p>Aproveitei a onda de mudanças e troquei o conjunto de teclas do meu teclado do dia a dia: agora instalei um conjunto chamado <a href="https://pt.aliexpress.com/item/1005006039633776.html">Rome</a>, que é vintage na aparência, e muito confortável pra digitar.</p>
<p>Já está tudo definido: por aqui a resolução do ano novo será 3840x2160!</p>
<div id="rodapes">
<div id="rodapes_halfline">&nbsp;</div>
<ol>
<li><a class=rodape_numero name="1_resolucao-de-ano-novo">&nbsp;</a>O Plex oferecia um recurso parecido nas suas smart playlists, mas não era exatamente o que eu queria. <a href="#ret-1_resolucao-de-ano-novo">↩</a></p>
</ol>
</div>
<p><!--id-rodapes--></p>
<p style="margin-top:1.5em; border-top:1px solid #d0d0d0;padding-top:0.3em;"><i>O artigo "<a href="https://trilux.org/2025/12/resolucao-de-ano-novo.html">Resolução de ano novo</a>" foi originalmente publicado no site <a href="https://trilux.org/">TRILUX</a>, de <a href="https://augustocampos.net/">Augusto Campos</a>.</i></p>]]></content:encoded>					
		</item>
		<item>
		<title><![CDATA[Programando bots para o Mastodon: listando usuários via API]]></title>
		<link>https://trilux.org/2025/12/programando-bots-para-o-mastodon-listando-usuarios-via-api.html</link>
		<pubDate>Mon, 15 Dec 2025 11:08:33 -0300</pubDate>
		<dc:creator><![CDATA[Augusto Campos]]></dc:creator>
		<description><![CDATA[A API do Mastodon é rica, e desenvolver clientes ou robôs para interagir com ela está ao seu alcance em várias linguagens, como veremos em mais um exemplo.]]></description>
		<content:encoded><![CDATA[<h2 class="mylead">A API do Mastodon é rica, e desenvolver clientes ou robôs para interagir com ela está ao seu alcance em várias linguagens, como veremos em mais um exemplo.</h2>
<p>Dando sequência aos exemplos de interação direta com a API do Mastodon que venho publicando, hoje veremos como obter a lista de usuários de uma instância, juntamente com dados sobre a sua atividade e identidade.</p>
<p>O ensejo para escrever este post foi o interesse em gerar <a href="https://arram.senta-la.cloud/@autobrain/115723763490526678">esta lista das contas mais falantes</a> da instância brasileira <a href="https://organica.social/explore">organica.social</a>, que a partir do início da semana passada recebeu uma migração de 700+ brasileiros, graças especialmente a uma ação bem-sucedida da <a href="https://organica.social/@bianaaf#.">Biana</a> na rede Bluesky.</p>
<p class="leftq" data-q="Requisitos para rodar o programa de exemplo">Para rodar os exemplos abaixo, você precisa ter uma shell Bash ou compatível, com o awk e o <a href="https://trilux.org/2023/03/gron-consuma-apis-da-web-jquery-usando-filtros-do-unix.html">gron</a> (para facilitar o consumo das respostas em formato <a href="https://www.json.org/json-en.html">JSON</a>), instalados em um sistema compatível com o Posix (como a maior parte das distribuições Linux, o Mac e Unix em geral).</p>
<p><figure><br />
	<img alt="foto de um brinquedo robô transformer em forma de elefante" src="https://static.efetividade.net/img/D-NQ-NP-914203-CBT44828790929-022021-O-61067.webp"><br />
</figure></p>
<p>Iremos direto ao ponto, e para uma explicação mais detalhada sobre alguns conceitos, sugiro a leitura também do post <a href="https://trilux.org/2024/07/programando-bots-para-o-mastodon-obtendo-dados-via-api.html">Programando bots para o Mastodon: obtendo dados via API</a>.</p>
<h2>Encaminhando consultas para a API do Mastodon</h2>
<p>Já vimos que a interface básica com uma instância do Mastodon é por meio de uma interface (a API) acessada por meio de URLs, e que responde em formato JSON. Há <a href="https://docs.joinmastodon.org/client/libraries/">uma série de bibliotecas</a> que intermediam esse acesso em várias linguagens, mas faremos o acesso diretamente, para demonstrar o funcionamento.</p>
<p>Nosso exemplo de hoje é baseado em um endpoint específico da API: o <code>/api/v1/directory</code>, que na minha instância fica visível pela URL <code>https://arram.senta-la.cloud/api/v1/directory</code> - se você acessá-la em seu navegador, verá uma longa linha contendo a lista dos <strong>usuários conhecidos pela instância</strong>.</p>
<p>Com o acesso básico (da URL acima), a resposta colocará os usuários em ordem de quem postou mais recentemente, e mostrará apenas os primeiros 40 usuários que a instância conhece – ou seja, os usuários que postam em alguma timeline, lista ou tag seguida pelos usuários da própria instância.</p>
<p>A URL também pode incluir parâmetros, como:</p>
<ul>
<li><code>local=true</code> - ao invés de listar todos os usuários que a instância conhece, lista apenas os usuários da própria instância.
<li><code>limit=60</code> - ao invés de retornar uma lista com até 40 contas, retornará até 60 (o máximo é 80)
<li><code>offset=120</code> - ao invés de começar a listar a partir do 1º usuário, começa do 120º usuário.
</ul>
<p>Embora só possamos receber 80 contas por vez, note que com uma sequência de chamadas usando <code>limit=80</code> e variando o parâmetro <code>offset</code>, podemos listar quantos quisermos: a primeira será com <code>offset=0</code> (que é o default), a segunda com <code>offset=80</code>, depois <code>160</code>, e assim por diante.</p>
<p>Vamos a 2 exemplos de URLs com parâmetros:</p>
<ul>
<li><code>https://arram.senta-la.cloud/api/v1/directory?local=true</code> - Retorna uma longa linha contendo apenas os usuários locais da minha instância (que é pequena, então será uma lista de meia-dúzia de contas).
<li><code>https://arram.senta-la.cloud/api/v1/directory?limit=80&offset=160</code> - retorna uma longa linha contendo o equivalente à terceira <em>página</em> (considerando que cada <em>página</em> são 80 contas) da lista de usuários conhecidos pela instância.
</ul>
<h2>Entendendo as respostas da API</h2>
<p>Essas longas linhas da resposta são difíceis de compreender visualmente, porque usam o formato <a href="https://www.json.org/json-en.html">JSON</a>, compatível com uma série de sistemas, mas de baixa legibilidade humana direta.</p>
<p>Há várias formas de ampliar a legibilidade do JSON mas, considerando os requisitos deste post, usaremos exemplos com o gron, já mencionado e linkado acima. Se você usar, numa shell compatível, o comando <code>gron &#39;https://arram.senta-la.cloud/api/v1/directory?local=true&#39; | head</code>, verá uma resposta como a da tela abaixo:</p>
<p><figure><br />
	<img alt="Tela de terminal mostrando o comando gron especificado acima, e com resposta descrita logo abaixo, no texto do post." src="https://static.efetividade.net/img/CleanShot-2025-12-14-at-14.24.43-24230.png"><br />
	<figcaption>Resposta da API decodificada com um campo por linha, usando o utilitário gron.</figcaption><br />
</figure></p>
<p>Note que agora, ao invés de uma linha gigante, temos uma sequência de linhas, cada uma mostrando um campo da resposta da API. Na tela acima, limitada a 10 linhas, todas as linhas se referem a um mesmo usuário e começam com json[0], como nos exemplos:</p>
<pre><code>
json[0].acct = "autobrain";
json[0].created_at = "2025-04-23T00:00:00.000Z";
json[0].discoverable = true;
json[0].display_name = "VISITE O DECORADO";
</code></pre>
<p>A listagem quanto ao primeiro usuário continua ainda por muitas outras linhas não visíveis na resposta (porque nós a cortamos com o filtro <code>head</code>) e, quando acabar, o próximo usuário começa em seguida, aí com o prefixo json[1], e assim por diante. Veja um exemplo das linhas da transição entre o 3º e o 4º usuários:</p>
<pre><code>
json[3].url = "https://arram.senta-la.cloud/@medidor";
json[3].username = "medidor";
json[4] = {};
json[4].acct = "TrendsBR";
json[4].bot = true;
</code></pre>
<p>Na versão atual da API, geralmente cada usuário é descrito por mais de 20 campos – ou seja, mais de 20 linhas geradas pelo <code>gron</code> –, e a último delas é referente ao campo <code>username</code>.</p>
<h2>Um script básico para listar usuários</h2>
<p>Este post de hoje nasceu de um script criado para apoiar a elaboração de uma <a href="https://arram.senta-la.cloud/@autobrain/115723763490526678">lista dos usuários mais ativos da instância brasileira organica.social</a>, que em dezembro de 2025 recebeu um grande influxo de usuários alcançados por uma bem-sucedida ação da <a href="https://organica.social/@bianaaf#.">Biana</a> na rede Bluesky.</p>
<p>Tudo que precisamos para fazer uma lista dessas pode ser obtido pelo endpoint <code>/api/v1/directory</code>, que conhecemos acima. Como a organica.social recebeu centenas de novos usuários, será necessário buscar nela várias <em>páginas</em> de resposta (cada <em>página</em> listando 80 contas, como vimos acima).</p>
<p>Entre os diversos atributos da conta, que a resposta da API descreve, os que nos interessam especialmente são o login, o nome, a data de criação da conta (pois para a nossa listagem queremos só os recém-chegados) e a contagem de posts. </p>
<p>Adicionaremos também o campo referente à quantidade de contas que a pessoa segue, para assim ser mais fácil identificar uma parte das pessoas que criou conta apenas para "reservar o login". Os campos são os seguintes, retirados diretamente da resposta do gron sobre a minha conta pessoal:</p>
<pre><code>
json[0].display_name = "VISITE O DECORADO";
json[0].following_count = 1194;
json[0].indexable = true;
json[0].statuses_count = 9579;
json[0].username = "autobrain";
</code></pre>
<p>Há uma infinidade de maneiras de extrair esses dados usando linguagens e utilitários, e o programa a seguir, em shell e awk (com apoio do gron) é uma delas. </p>
<p>Ele baixa as 6 primeiras páginas de resultados, o que corresponde a até 480 contas - ou, no caso, as 480 contas locais da instância, que tiverem postado mais recentemente. Em seguida, ele faz um processamento básico de formatação das linhas (extraindo a identificação do campo e o ";" ao final da linha) e produz a saída em formato CSV básico, ou seja, com os campos separados por vírgulas, as linhas separadas por Return, e as strings entre aspas.</p>
<p>Segue a listagem completa:</p>
<pre><code>
<strong>#!/usr/bin/env bash
#
# masto_userdir.sh - exemplo de uso da API &#39;directory&#39; do Mastodon
#
# Copyright (c) 2025,  Augusto Campos (https://augustocampos.net/).
# Licensed under the Apache License, Version 2.0.
#</strong>

echo "DISPLAY_NAME,FOLLOWING_COUNT,INDEXABLE,STATUSES_COUNT,USERNAME"
delta=0
inst="organica.social"
url="https://&#36;inst/api/v1/directory?local=true&limit=80&offset=&#36;delta"

<strong># loop de 6 leituras</strong>
for i in {1..6}; do
  gron "&#36;url" | awk &#39;
  <strong># filtra só as linhas desses campos mencionados:</strong>
  /\.(display_name|following_count|indexable|statuses_count|username) = / {

    <strong># separador será uma vírgula, exceto no último campo ("username"),</strong> 
    <strong># quando será um Return:</strong>
    SEP=","
    if (&#36;1 ~ /\.username/) SEP="
"

    <strong># remove a identificação do campo ("json[x].xxx"), o "=" e o ";"</strong>
    &#36;1=&#36;2=""
    sub(/;&#36;/,"")

    <strong># gera a saída com o conteúdo do campo e o separador</strong>
    printf("%s"SEP, substr(&#36;0,3))
  }&#39;

  <strong># antes de repetir o loop, aumenta o valor que será usado no "offset"</strong>
  delta=&#36;((delta + 80))
done
</code></pre>
<p>Explicações sobre a linguagem estão fora do escopo deste post, mas incluí comentários nos trechos do código, para orientar quem preferir implementar com estrutura similar, em sua tecnologia favorita.</p>
<p>A saída produzida será algo similar a essa, que é o resultado de rodar o mesmo programa, mas direcionado à minha instância:</p>
<pre><code>
DISPLAY_NAME,FOLLOWING_COUNT,INDEXABLE,STATUSES_COUNT,USERNAME
"Locutora de feeds",1,true,1168,"locutora"
"VISITE O DECORADO",1194,true,9581,"autobrain"
"Gugu",0,true,176,"gugu"
"Medidor de ranço",11,true,63,"medidor"
"Trends Brasil 🚀",1,true,827,"TrendsBR"
"Madame Sandra Rosa Madalena",22,true,31,"MadameSandra"
"Tags Temáticas BR",2,true,366,"TagsBR"
"Bebê Taz Ininteligível",24,true,433,"aridiculaideia"
"Sextou, galera!",1,true,6,"sextou"
</code></pre>
<p>Note que esse formato de saída com linhas, aspas e separação por vírgulas, conhecido como <a href="https://pt.wikipedia.org/wiki/Comma-separated_values">CSV</a> (ou RFC 4180), serve para ser importado em planilhas, bancos de dados e outros sistemas, e aí usá-los para reordenar, classificar, aplicar condições, gerar gráficos e o que mais você quiser fazer com essas informações – no meu caso, serviu para gerar uma thread no Mastodon.</p>
<p>O programa acima é bem cru, e tem muitas oportunidades de melhoria para você se exercitar, inclusive pela adição de tratamento de erro e de ser capaz de perceber que ele está tentando ler mais usuários do que a instância tem - na versão acima, o loop de 6 leituras é feito até mesmo para instâncias com menos de 80 usuários, e aí repete várias vezes a resposta da primeira leitura.</p>
<p>Um detalhe importante é que, embora o protocolo do Mastodon preveja que esse endpoint da API seja acessado sem precisar de autenticação, algumas instâncias configuram (com intenções variadas e eficácia baixa) bloqueios a esse acesso não autenticado, então se você experimentar em uma instância e não receber resposta, essa é uma das razões possíveis.</p>
<h2>Referências e documentação</h2>
<p>Venho preferindo exemplos com operações simples, envolvendo apenas um endpoint de API por vez, e com acesso a dados públicos, porque desenvolver interfaces ou clientes para o Mastodon tem uma escala de complexidade a ser vencida, como em tudo na vida, e não há razão para começar já tentando operações difíceis, autenticadas e envolvendo múltiplas instâncias e entidades.</p>
<p>Lembre-se que a API do Mastodon é bem documentada, e desde já recomendo os capítulos "<a href="https://docs.joinmastodon.org/client/intro/">Getting Started with the API</a>", "<a href="https://docs.joinmastodon.org/client/public/">Playing with public data</a>" e "<a href="https://docs.joinmastodon.org/methods/directory/">Directory API methods</a>" para entendimento aprofundado do que apresentei acima com bem menos detalhes.</p>
<p>Leia também o post anterior: t <a href="https://trilux.org/2024/07/programando-bots-para-o-mastodon-obtendo-dados-via-api.html">Programando bots para o Mastodon: obtendo dados via API</a>.</p>
<p style="margin-top:1.5em; border-top:1px solid #d0d0d0;padding-top:0.3em;"><i>O artigo "<a href="https://trilux.org/2025/12/programando-bots-para-o-mastodon-listando-usuarios-via-api.html">Programando bots para o Mastodon: listando usuários via API</a>" foi originalmente publicado no site <a href="https://trilux.org/">TRILUX</a>, de <a href="https://augustocampos.net/">Augusto Campos</a>.</i></p>]]></content:encoded>					
		</item>
		<item>
		<title><![CDATA[O valor da Duolingo e o mercado ~sedento por IA]]></title>
		<link>https://trilux.org/2025/12/o-valor-da-duolingo-e-o-mercado-sedento-por-ia.html</link>
		<pubDate>Sat, 06 Dec 2025 11:19:00 -0300</pubDate>
		<dc:creator><![CDATA[Augusto Campos]]></dc:creator>
		<description><![CDATA[Às vezes o mesmo fator que barateia custos também corrói valor, e essa é a história contada pelas ações do Duolingo em 2025.]]></description>
		<content:encoded><![CDATA[<h2 class="mylead">Às vezes o mesmo fator que barateia custos também corrói valor, e essa é a história contada pelas ações do Duolingo em 2025.</h2>
<p>A gente ouve o tempo todo que o mercado está sedento por IA. É verdade, dependendo do contexto, mas já não está mais como foi até recentemente, e esse gráfico das ações do Duolingo nos EUA ilustra isso muito bem.</p>
<p>Em abril o valor subiu muito, após anunciarem que <a href="https://www.theverge.com/news/657594/duolingo-ai-first-replace-contract-workers">iam demitir a galera dos idiomas e trocar por IA</a>. Era verdade, e eles produziram bem mais conteúdo desse jeito. Mas também é verdade que isso produziu uma dose de má-vontade com a marca, por parte de uma parcela do mercado, especialmente quando surgiram relatos sobre a qualidade variável dos conteúdos produzidos a partir de então.</p>
<p><figure><br />
	<img alt="Gráfico do valor da ação do Duolingo na NASDAQ ao longo dos últimos 365 dias, descrito em maior detalhe no parágrafo imediatamente seguinte, no texto do post." src="https://static.efetividade.net/img/Captura-de-Tela-2025-12-06-as-10.39.08-42371.png"><br />
	<figcaption>Gráfico do valor da ação do Duolingo na NASDAQ ao longo dos últimos 365 dias.</figcaption><br />
</figure></p>
<p>O gráfico acima mostra uma escalada súbita na virada de abril para maio (logo após o CEO anunciar que ia trocar por IA a mão de obra contratada que lidava com idiomas), e uma queda também súbita na virada de outubro para novembro, logo após a divulgação da previsão de desempenho para o próximo ano. </p>
<p>O mesmo gráfico também permite verificar que a ação vale hoje 38% a menos do que há 365 dias, e que entre a subidona e a descidona tivemos um longo período de queda menos acentuada – a realidade não sustentou as previsões do final de abril.</p>
<h4>Por que o valor despencou em novembro?</h4>
<p>Tem toda uma questão da dinâmica (e aprendizado) do mercado aí envolvida, mas também dá pra notar um ponto importante relacionado à estratégia: em abril/maio o que o mercado valorizou foi um aspecto de processos internos da empresa: ia ficar mais barato produzir o serviço que os clientes da empresa topam comprar.</p>
<p>Já em novembro, o que aconteceu é sobre algo mais relevante: a percepção (que veio quando a empresa publicou o relatório obrigatório sobre expectativas para o ano seguinte) de que aquele ganho de abril está ao alcance de todos os concorrentes, e o diferencial da proposta de valor do Duolingo já era.</p>
<p>Ou seja: oferecer grande volume de material sobre idiomas produzido por IA é mais barato para o Duolingo, mas está ao alcance de diversos outros concorrentes também, e o produto de todos tende a ficar parecido – e a percepção de liderança dessa marca foi abalada.</p>
<p>Pode mudar? Pode, mercado de ações é dinâmico. Inclusive, quem sabe alguém contrata aquelas pessoas que em abril ficaram disponíveis, e recupera o diferencial?</p>
<p style="margin-top:1.5em; border-top:1px solid #d0d0d0;padding-top:0.3em;"><i>O artigo "<a href="https://trilux.org/2025/12/o-valor-da-duolingo-e-o-mercado-sedento-por-ia.html">O valor da Duolingo e o mercado ~sedento por IA</a>" foi originalmente publicado no site <a href="https://trilux.org/">TRILUX</a>, de <a href="https://augustocampos.net/">Augusto Campos</a>.</i></p>]]></content:encoded>					
		</item>
		<item>
		<title><![CDATA[Cuidado com o imobilismo bem intencionado]]></title>
		<link>https://trilux.org/2025/11/cuidado-com-o-imobilismo-bem-intencionado.html</link>
		<pubDate>Sun, 30 Nov 2025 17:04:35 -0300</pubDate>
		<dc:creator><![CDATA[Augusto Campos]]></dc:creator>
		<description><![CDATA[Não pergunte se você é uma boa pessoa, e sim se você está fazendo coisas boas.]]></description>
		<content:encoded><![CDATA[<h2 class="mylead">Não pergunte se você é uma boa pessoa, e sim se você está fazendo coisas boas.</h2>
<p>Quantas iniciativas coletivas eu já vi naufragarem porque, ao invés de prevalecer o impulso de quem queria produzir avanços com atos concretos, prevalecia a atitude paralisante de quem defende evitar a qualquer custo fazer qualquer coisa imperfeita.</p>
<p>Isso é um mal frequente em organizações voluntárias, e em grupos motivados por um ideal de evolução – mas pode se manifestar até na vida individual, quando a pessoa se pergunta muito mais “será que eu sou uma boa pessoa?” do que “será que o que estou fazendo é bom?”</p>
<p>E há uma pergunta ainda melhor pra impulsionar a mudar o mundo (e a própria realidade individual) para melhor: <strong>“Qual coisa boa eu posso fazer, aqui e agora?”</strong></p>
<p><figure><br />
	<img alt="Foto de um ponbo que comeu o miolo de uma fatia de pão e acabou ficando com a casca dela pendurada em seu pescoço, como um colar." src="https://static.efetividade.net/img/r46obyna9sm21-49737.jpg"><br />
</figure></p>
<p>Tentar ser uma boa pessoa, embora seja uma atitude virtuosa, pode ser sufocante e paralisante. É mais frutífero o caminho de quem procura, ao invés disso, fazer coisas boas (ou “fazer o bem”, dependendo do contexto).</p>
<p><q>Não se trata de defender ações perversas, desonestas ou irresponsáveis: elas são incompatíveis com o conceito de fazer coisas boas.</q></p>
<p>O critério da ação voluntária e orientada a ideais não pode ser aquele modelo inodoro e insípido do "zero defeito" ou da busca por zerar riscos - os processos precisam ser orientados a produzir o resultado, por meios bons. </p>
<p style="margin-top:1.5em; border-top:1px solid #d0d0d0;padding-top:0.3em;"><i>O artigo "<a href="https://trilux.org/2025/11/cuidado-com-o-imobilismo-bem-intencionado.html">Cuidado com o imobilismo bem intencionado</a>" foi originalmente publicado no site <a href="https://trilux.org/">TRILUX</a>, de <a href="https://augustocampos.net/">Augusto Campos</a>.</i></p>]]></content:encoded>					
		</item>
	</channel>
</rss>
