sexta-feira, 26 de dezembro de 2025

Árvore genealógica com JavaScript e Mermaid.JS

Depois de muito pouco comprometimento com desenvolvimento, seja por obrigação, seja por diversão, eu encontrei um grupo da família e pude obter dados que remontavam aos meus bisavós. Então já que havia muita gente que não se conhecia e não sabia em que posição na família cada um se encontrava, tive a ideia de montar uma árvore genealógica. Daí fiquei buscando algumas formas de como montar uma árvore genealógica. E houve aquelas formas mais corriqueiras como utilizar algum editor de imagens ou montar retângulos com traços os ligando-os, mas que óbvio ficava bem ruim pois a edição é custosa. Então tentei uma solução em JavaScript associado uma página HTML Encontrei alguns pacotes no Github que iam nessa abortagem. A principal solução desse tipo foi o Treant-js encontrado em http://fperucic.github.io/treant-js , trabalho do Fran Peručić.
Captura de tela do site Treant.js, uma biblioteca JavaScript baseada em SVG para visualização de diagramas em árvore. No topo, há o logotipo com o nome ‘Treant.js’ e a frase ‘JavaScript library for visualization of tree diagrams’. Abaixo, um menu de navegação com opções como Quick Start, Introduction, API, Examples e Download. Na seção principal, intitulada ‘Quick Start Demos’, são exibidas miniaturas de exemplos de diagramas, incluindo organograma empresarial, árvore de resultados esportivos, estrutura colapsável, árvore de evolução e itens personalizados por cores.
Treant.JS do Fran Peručić

Então passei para o Gemini e ChatGPT para criar a estrutura básica da página HTML e desta vez o Gemini se saiu melhor que o ChatGPT apesar de o resultado final não ter sido perfeito. Das 6 versões geradas 4 no Gemini e 2 no ChatGPT, exatamente nesta sequência a versão número 2 do Gemini ficou melhor porém incompleta. E não houve meio de explicar para ele nem para o ChatGPT para basicamente incluir os recursos que estavam faltando sem alterar a estrutura já criada. Pois bem todas as vezes foram propostas soluções diferentes nunca agregando o que estava faltando. Por fim peguei a versão 2 (a melhor no meu julgamento) e finalizei o código para que as árvores criadas pudessem ser persistidas (sendo salva e/ou carregada) e assim não ter que refazer a árvore do zero todas as vezes. Na versão 2 em si, o Gemini escolheu a Cytoscape.js - uma biblioteca JavaScript aberta e bem completa de recursos para criação de grafos com possibilidade de visualização e interação, sem falar que é amplamente usada.
Captura de tela do site oficial Cytoscape.js, biblioteca JavaScript para visualização e análise de grafos e redes. No topo, aparece o logotipo Cytoscape.js e a descrição ‘Graph theory (network) library for visualisation and analysis’, acompanhados de selos informativos como versão, licença MIT, repositório GitHub e estatísticas de uso. À esquerda, há um menu de navegação vertical com seções como Introduction, Notation, Getting started e Architecture & API. Na área principal, a seção ‘Demos’ exibe miniaturas de exemplos de grafos interativos, incluindo redes gene-gene, mapa das ferrovias de Tóquio, relações entre vinhos e queijos, diagramas SBGN e exemplos de extensões
Cytoscape.js - Biblioteca JS topíssima !!!


 Apesar de a combinação de recursos ter sido boa suficiente para criar uma árvores simples, não explorei funcionalidades de melhor visualização. O código resultante do trabalho inicial do Gemini e finalização e revisão feita por mim está disponível no meu Github.
Captura de tela de uma aplicação web de genealogia. À esquerda, há um painel lateral escuro intitulado ‘Genealogia’, com formulários para cadastro de pessoas e casamentos, incluindo campos como nome completo, seleção de cônjuges e botões ‘Salvar Pessoa’ e ‘Casar’. À direita, ocupa a maior parte da tela um grande diagrama de árvore genealógica, com várias gerações representadas por caixas retangulares conectadas por linhas coloridas, indicando relações familiares e casamentos organizados hierarquicamente.
Meu formulário simples usando Cytoscape


A partir dessa segunda solução, o Gemini me sugeriu utilizar o Mermaidchart.com que é um conjunto de ferramentas (web, textos e código). Mermaid permite a criação de diagramas e sua visualização usando texto e código. É baseado em JavaScript e pode ser integrado de diferentes formas além de ter recursos de IA para otimização de código e geração de gráfico a partir de texto. Ou seja serve para criar os gráficos mais diversos e serve também para árvores genealógicas. Porém o Mermaid permite mais facilmente (não que os outros não tenham tais recursos) uma visão mais confortável e atraente. Um trabalho futuro interessante seria trabalhar  incrementos tais como a integração numa página HTML, bem como testar a descrição da genealogia em texto e deixar o Mermaid fazer o resto. Mas enfim completei a tarefa e posso dizer que pelo menos fiz um gol de honra.
Captura de tela de uma ferramenta web de edição de diagramas baseada em código. À esquerda, há um painel de código com sintaxe Mermaid, exibindo um fluxograma orientado da esquerda para a direita e definições de estilos por classes de cores. No topo, aparecem controles como ‘Auto Layout’ e ‘Manual Layout’, além de opções de exportação e compartilhamento. À direita, ocupa a maior parte da tela um grande diagrama hierárquico renderizado automaticamente, composto por dezenas de nós retangulares coloridos e conectados por linhas, representando uma estrutura complexa em forma de árvore. Há também ferramentas de navegação, zoom e edição visual distribuídas ao redor da área do diagrama.
Interface da MermaidChart para fazer qualquer gráfico

sábado, 6 de dezembro de 2025

"One Battle After Another" e a revolução que sacrifica as pessoas que pretende libertar


Pôster do filme 'One Battle After Another' sobreposto por duas faixas de alerta diagonais nas cores amarelo e preto (uma no canto superior e outra no inferior), contendo a frase repetida '- SPOILERS ALERT -'. A imagem de fundo apresenta um close do perfil de Leonardo DiCaprio em tons alaranjados, fundido com a imagem de uma mulher correndo em uma estrada desértica segurando uma arma e algemas
Poster do filme
Este post contém spoilers do filme. Se tiver problemas com isso, leia outro post. 
Eu assisti inicialmente com alguma curiosidade e depois com espanto "One Battle After Another" cuja a síntese no IMDB enfoca a reunião de revolucionários para salvar a filha de um deles da perseguição de pessoas poderosas. Um filme em geral é uma obra bem construída que envolve o trabalho de muita gente (de produtores, roteiristas, diretores, atores, pessoal técnico - luz, som, figurino, maquiagem, dublês, e depois pós-produação) e por fim é emitido um manifesto e se destaca a mensagem que se quer apresentar e convencer. Ou seja nunca é algo descuidado, ou pelo menos não era para ser. Apesar de haver a perseguição destacada pela síntese do IMDB, ela é bem fantasiosa. Então vamos às inconsistências que julgo tornarem "One Battle After Another" um filme que podia ser bem melhor.
Primeiro que ao apontar estes pontos que julgo serem falhos, não quero de modo algum dizer que o filme é mal feito, até onde puder perceber assistindo somente uma vez não tem erros de continuidade e aquelas falhas que eventualmente passam desapercebidas nas pós-produção. Mas vamos ao que quero destacar.

Inicialmente não é ponto falho, mas só uma curiosidade, aparentemente todos os principais personagens são desempenhados por atores e atrizes alinhados com pautas progressistas no mundo, é quase uma panelinha de amigos de partido. Mas ok, isso não é problema, trabalhar com pessoas com as quais se tem mais identificação deve ser positivo.

Vamos aos pontos de fraqueza. 
1. Os membros do grupo revolucionário (terrorista ?) French 75 (fictício ou não?) resgatam imigrantes que são presos pelos EUA em locais de detenção, atacam comitês de políticos contrários, assaltam, roubam, sabotam aparentemente de forma impune, são descuidados em mostrar rostos e deixar pistas. Conseguem com relativa facilidade armas, equipamentos e dinheiro para suas incursões. Para mim é bem estranho um grupo descuidado atuar sem ser incomodado. 

2. O único incômodo é Cel Steven J. Lockjaw que até tem chance de interceptar o grupo mas não o faz para realizar a tara sexual com Perfídia, a revolucionária-mor. É uma baita de uma inconsistência, o militar perseguidor, responsável pela segurança e por caçar o grupo terrorista, abandona usa função atraído pela revolucionária cujo maior traço de personalidade é não seguir qualquer regra. Pois bem a revolucionária aceita a proposta do militar e o satisfaz ainda que seja uma única vez.

3. Perfidia, rebelde, sem contenções, sem amarras, sem se encaixar em qualquer estereótipo social fica grávida e ao contrário do que defende e promove (fazer um ab0rto) decidir ir até o final da gravidez, pois por incrível que pareça ela tem uma relação estranhamente estável com Pat ou Bob (ele usa vários nomes no filme). Ela decide ter uma criança de um homem que é tudo o que ela mais odeia e luta contra.
Pôster do filme 'Uma Batalha Após a Outra'. A imagem central mostra uma mulher em um campo aberto, vestindo gorro, calças militares e uma camisa xadrez aberta que expõe sua barriga de grávida, enquanto dispara uma metralhadora pesada. No topo, em letras vermelhas, estão os nomes do elenco: Leonardo DiCaprio, Sean Penn, Benicio Del Toro, Regina Hall, Teyana Taylor e Chase Infiniti. O título aparece em destaque no centro
Perfidia atirando com uma arma de grosso calibre e gravidíssima

4. Após dar a luz a uma menina, Perfidia não consegue ter qualquer sentimento maternal com a criança e entre ciúmes, arrependimentos e insatisfações larga a família e cai nas ações de terror novamente. Assalta, mata pessoas inocentes em nome da revolução contra a sociedade, os poderosos, os capitalistas, etc.

5. Perfidia é presa pelo mesmo Lockjaw e ao contrário do que se esperava ela canta feito um passarinho, entregando os companheiros. Lockjaw aproveita e mata alguns e prende outros. Lockjaw coloca Perfidia no programa de proteção, achando que ela vai se tornar a esposinha devotada dele. Ledo engado, Perfidia volta a ter um comportamente compatível com uma revolucionária. Foge, deixando a nova identidade recebida e não aparece mais no fim do filme, meio que vai revolucionar outras partes do mundo. Pat foge com a criança, passa a usar o nome de Bob e começam as inconsistências de novo.

6. Para um grupo revolucionário tão ativo e descuidado, o French 75 tem uma rede de apoio estabelecida para prover fugas e apoiar os membros, usam técnicas para não serem rastreados, utilização de tecnologias analógicas para acobertar e desaparecer de buscas policiais, técnicas de identificação de outros membros, central telefônica para suporte com senhas definidas em manuais. Espantoso para o grupo tão inconsequente que entrega os membros no primeiro aperto.

7. Bob (que não é o pai biológico) cria Charlene por 16 anos sozinho e ela se torna uma garota maravilhosa. Mais comprometida e responsável que o próprio pai que com o passar dos anos, a perda de companheiros, isolamento passa a abusar em álcool e drogas (esta parte é bem fiel a realidade) claro que ele fica enferrujado e vulnerável. Coloquei como inconsistência, mas é uma das coisas mais razoáveis no filme. O que é inconsistente é Bob com a cabeça e corpo comprometidos conseguir passar por toda a sequência de ação que a fuga vai requerer.

8. Lockjaw, nos 16 anos que se passaram, ascendeu na hierarquia. Quer entrar num grupo, num clube de extremistas supremacistas e percebe que a possibilidade de ser pai de uma filha mestiça pode impedir a entrada no clube. Então ele começa a perseguição a garota. Tal grupo é uma fantasia - talvez mais fantástico do que o French 75. Mas de modo estranho Lockjaw começa a caçada e descobre Bob e a filha numa cidade pequena vivendo discretamente, e que mesmo com a ajuda da comunidade da cidade e do French 75 são encontrados.

9. Depois de muito embates, lutas, feridos e mortos, Lockjaw faz um teste de DNA e confirma a sua paternidade sobre a garota. Lockjaw parece impiedoso, tem muito poder, mata pessoas sem vacilar, mas não consegue matar a filha que não criou e por quem não parece ter nenhum sentimento. Delega a função a um matador que de cara diz que não mata crianças. É um matador cheio de princípios.

10. Numa parte do filme são apresentadas freiras negras que vivem num convento bem ascético e recluso, vivendo do que plantam e plantam maconha, e fumam maconha e usam armas automáticas em campos de tiro, por quê ? Porque a bandeira de ser alternativo tem que ser hasteada e tremulada para a audiência. 

O restante dos eventos julgo razoáveis dados pontos que listei acima. A garota escapa, mata um perseguidor, é encontrada por Bob. Eles fogem novamente. Lockjaw tem sua entrada aceita no grupo mas é morto pelo grupo que sabe que ele não atende aos critérios para fazer parte do mesmo. É o fascista sendo morto pelos fascistas.

E assim termina "One Battle After Another", com aquele gostinho de vitória sobre os vilões e povo que luta contra os opressores (ainda que matem alguns inocentes) sobrevive para contar a história. Mas que claramente ambos os grupos são extremistas e desconsideram a vida dos outros, dos que não concordam com seus posicionamentos. E esses extremismos são muito ruins e por isso posso dizer que é filme é péssimo.