Translate

domingo, 5 de agosto de 2018

Blog Analytics : Parte VI – Criando o Motor de Regras do Bellacosa Blog Doctor

 

Bellacosa Mainframe e o blog analytics parte vi

☕ Um Café no Bellacosa Mainframe

Blog Analytics : Parte VI – Criando o Motor de Regras do Bellacosa Blog Doctor

Como transformar sinais dispersos em diagnósticos padronizados, prioridades, códigos de retorno e recomendações automáticas

Quando um simples if deixa de ser suficiente e nasce o RACF das regras editoriais

☕ Um Café no Bellacosa Mainframe

Na Parte V, construímos a arquitetura geral do Bellacosa Blog Doctor.

Definimos a ferramenta como um scanner automático capaz de ler o Feed Atom do Blogger, normalizar milhares de publicações, analisar HTML, SEO, acessibilidade, conteúdo, links, imagens e resíduos deixados por editores externos.

Mas uma arquitetura, por melhor que seja, ainda é apenas o mapa do Data Center.

Ela mostra:

  • onde os dados entram;

  • onde são processados;

  • onde são classificados;

  • onde os relatórios serão gerados.

Falta agora construir aquilo que realmente decide se um post está saudável, suspeito, degradado ou perigosamente próximo de um ABEND editorial.

Falta o Motor de Regras.

É esse componente que transforma observações técnicas em diagnósticos consistentes.

Sem ele, teríamos apenas dezenas de funções independentes:

if (tituloCurto) ...
if (imagemSemAlt) ...
if (possuiResiduoIA) ...
if (naoTemLinkInterno) ...
if (temTabelaDentroDeParagrafo) ...

No começo, isso parece funcionar.

Depois surgem vinte regras.

Em seguida cinquenta.

Logo aparecem exceções, categorias, pesos diferentes, severidades, mensagens, sugestões de correção, limites configuráveis e versões históricas.

Quando percebemos, o código virou um emaranhado de decisões espalhadas por toda a aplicação.

No mainframe, isso seria como esconder regras críticas de negócio em centenas de parágrafos COBOL, sem tabela de decisão, sem copybook, sem documentação e sem qualquer possibilidade de saber qual alteração afetou qual processamento.

O Bellacosa Blog Doctor precisa de algo melhor.

Precisa de um motor centralizado, extensível, auditável e previsível.


O Que é um Motor de Regras?

Um motor de regras é um componente responsável por receber dados, aplicar condições predefinidas e produzir resultados padronizados.

No nosso caso, ele recebe um objeto representando um post:

{
  titulo: "ABEND sem Mistérios",
  palavras: 1842,
  html: "<h2>...</h2>",
  imagens: 4,
  imagensSemAlt: 2,
  linksInternos: 0,
  marcadores: ["COBOL", "Mainframe"],
  residuosIA: 3
}

Depois percorre um catálogo de regras.

Cada regra responde perguntas como:

  • este post viola alguma condição?

  • qual é a gravidade?

  • quantos pontos devem ser descontados?

  • qual mensagem deve ser apresentada?

  • qual recomendação deve ser exibida?

  • qual código de diagnóstico será associado?

  • a regra deve ser ignorada em algum contexto?

O resultado deixa de ser apenas um booleano.

Passa a ser um diagnóstico completo.

{
  codigo: "BBDACC002E",
  categoria: "Acessibilidade",
  gravidade: "alta",
  quantidade: 2,
  penalidade: 8,
  mensagem: "Foram encontradas imagens sem texto alternativo",
  recomendacao: "Adicionar atributos ALT descritivos às imagens"
}

Esse formato é o equivalente editorial de uma mensagem padronizada de sistema.


Por Que Não Espalhar if Pelo Código?

Imagine uma versão inicial.

let score = 100;

if (post.titulo.length < 20) {
  score -= 7;
}

if (post.palavras < 300) {
  score -= 15;
}

if (post.imagensSemAlt > 0) {
  score -= 10;
}

Esse código não está errado.

O problema aparece quando o projeto cresce.

Suponha que cada regra também precise ter:

  • código;

  • categoria;

  • mensagem;

  • recomendação;

  • gravidade;

  • penalidade máxima;

  • quantidade;

  • exceção;

  • versão;

  • documentação.

O if simples já não é suficiente.

Pior: se as regras estiverem espalhadas em funções diferentes, torna-se difícil responder:

  • quantas regras existem?

  • quais estão ativas?

  • quais pertencem ao módulo SEO?

  • quais são críticas?

  • qual regra gerou determinado alerta?

  • qual versão introduziu a penalidade?

  • quais regras devem ser desativadas em posts antigos?

Em sistemas críticos, regra espalhada é dívida técnica.

O Motor de Regras existe para concentrar as decisões.


A Estrutura Básica de uma Regra

Uma regra deve ser tratada como um objeto configurável.

const regraTituloCurto = {
  codigo: "BBDSEO001W",
  nome: "Título muito curto",
  categoria: "SEO",
  gravidade: "media",
  penalidade: 7,
  testar(post) {
    return post.titulo.length < 20;
  },
  mensagem(post) {
    return `O título possui apenas ${post.titulo.length} caracteres`;
  },
  recomendacao:
    "Revisar o título e torná-lo mais descritivo sem exagerar no comprimento"
};

Essa estrutura já é muito mais poderosa.

Ela separa:

  • identidade;

  • lógica;

  • gravidade;

  • penalidade;

  • explicação;

  • recomendação.

O motor não precisa saber os detalhes de cada regra.

Ele apenas executa todas de forma padronizada.


O Catálogo Central de Regras

O ideal é guardar as regras em um único catálogo.

const regras = [
  regraTituloCurto,
  regraTituloLongo,
  regraConteudoCurto,
  regraImagemSemAlt,
  regraSemLinkInterno,
  regraResiduoIA,
  regraResiduoWord,
  regraTabelaEmParagrafo
];

Ou diretamente:

const regras = [
  {
    codigo: "BBDSEO001W",
    categoria: "SEO",
    gravidade: "media",
    penalidade: 7,
    testar: post => post.titulo.length < 20,
    mensagem: post =>
      `Título com ${post.titulo.length} caracteres`,
    recomendacao:
      "Criar um título mais informativo"
  },
  {
    codigo: "BBDACC002E",
    categoria: "Acessibilidade",
    gravidade: "alta",
    penalidade: 4,
    penalidadeMaxima: 12,
    testar: post => post.imagensSemAlt > 0,
    quantidade: post => post.imagensSemAlt,
    mensagem: post =>
      `${post.imagensSemAlt} imagem(ns) sem ALT`,
    recomendacao:
      "Adicionar texto alternativo descritivo"
  }
];

Agora temos algo parecido com uma tabela de parâmetros.

Em vez de alterar dezenas de funções, adicionamos ou modificamos uma entrada no catálogo.


O Executor de Regras

O executor recebe um post e percorre o catálogo.

function executarRegras(post, regras) {
  const ocorrencias = [];

  for (const regra of regras) {
    const resultado = regra.testar(post);

    if (!resultado) {
      continue;
    }

    const quantidade =
      typeof regra.quantidade === "function"
        ? regra.quantidade(post)
        : 1;

    const penalidadeBase =
      typeof regra.penalidade === "function"
        ? regra.penalidade(post, quantidade)
        : regra.penalidade || 0;

    const penalidade = regra.penalidadeMaxima
      ? Math.min(penalidadeBase * quantidade, regra.penalidadeMaxima)
      : penalidadeBase;

    ocorrencias.push({
      codigo: regra.codigo,
      nome: regra.nome,
      categoria: regra.categoria,
      gravidade: regra.gravidade,
      quantidade,
      penalidade,
      mensagem:
        typeof regra.mensagem === "function"
          ? regra.mensagem(post, quantidade)
          : regra.mensagem,
      recomendacao: regra.recomendacao
    });
  }

  return ocorrencias;
}

A lógica está centralizada.

Cada regra decide quando deve disparar.

O executor apenas padroniza o resultado.


Mensagens no Estilo Mainframe

Uma das identidades mais interessantes do Bellacosa Blog Doctor pode ser o uso de mensagens inspiradas no universo IBM.

Exemplo:

BBDSEO001W TITLE LENGTH BELOW RECOMMENDED VALUE
BBDACC002E IMAGE WITHOUT ALT ATTRIBUTE DETECTED
BBDHTML004E TABLE FOUND INSIDE PARAGRAPH
BBDIA001I AI INTERFACE METADATA DETECTED
BBDDOC003W MICROSOFT WORD RESIDUE FOUND

A estrutura pode seguir este padrão:

BBD + MÓDULO + NÚMERO + SEVERIDADE

Exemplo:

BBDSEO001W

Significado:

BBD........Bellacosa Blog Doctor
SEO........Módulo SEO
001........Número da mensagem
W..........Warning

Podemos adotar:

I – Information
W – Warning
E – Error
S – Severe

Assim, cada ocorrência possui uma identidade única.


Definindo os Módulos

O catálogo pode ser separado por áreas.

HTML

Prefixo:

BBDHTML

Exemplos:

BBDHTML001W – Heading vazio
BBDHTML002E – Tabela dentro de parágrafo
BBDHTML003W – Mais de um H1
BBDHTML004W – Excesso de estilos inline

SEO

Prefixo:

BBDSEO

Exemplos:

BBDSEO001W – Título curto
BBDSEO002W – Título longo
BBDSEO003W – Conteúdo curto
BBDSEO004W – Sem links internos

Acessibilidade

Prefixo:

BBDACC

Exemplos:

BBDACC001E – Imagem sem ALT
BBDACC002W – Link sem texto descritivo
BBDACC003W – Heading fora de sequência

Resíduos

Prefixos:

BBDIA
BBDDOC

Exemplos:

BBDIA001I – Resíduo de interface de IA
BBDDOC001W – Resíduo do Microsoft Word
BBDDOC002W – Excesso de spans do Google Docs

Links

Prefixo:

BBDLNK

Exemplos:

BBDLNK001W – Link HTTP
BBDLNK002W – Link vazio
BBDLNK003E – Link JavaScript suspeito

Gravidade Não é a Mesma Coisa que Penalidade

Uma regra pode ter gravidade alta, mas penalidade moderada.

Outra pode ter gravidade baixa e aparecer centenas de vezes.

Precisamos separar os conceitos.

Gravidade

Representa o impacto técnico de uma ocorrência individual.

INFORMATIVA
BAIXA
MÉDIA
ALTA
CRÍTICA

Penalidade

Representa quanto aquela ocorrência reduz o score.

Exemplo:

{
  gravidade: "alta",
  penalidade: 4,
  penalidadeMaxima: 12
}

Se houver uma imagem sem ALT:

Penalidade: 4

Se houver três:

Penalidade: 12

Se houver dez:

Penalidade: continua limitada a 12

Sem um limite, um único tipo de erro poderia zerar o score inteiro.


Penalidade Fixa e Penalidade Progressiva

Existem dois modelos principais.

Penalidade fixa

A regra desconta sempre a mesma quantidade.

penalidade: 8

Exemplo:

Sem links internos: -8

Penalidade progressiva

A penalidade depende da quantidade.

penalidade: 3,
penalidadeMaxima: 12

Exemplo:

1 imagem sem ALT........-3
2 imagens sem ALT.......-6
3 imagens sem ALT.......-9
4 ou mais..............-12

Esse modelo é ideal para ocorrências repetidas.


Regras Dependentes do Contexto

Uma ferramenta inteligente não deve aplicar regras de forma cega.

Imagine a regra:

Post sem link interno

Ela faz sentido para um artigo de 2.000 palavras.

Talvez não faça sentido para um comunicado de 80 palavras ou uma página composta apenas por vídeo.

Logo, a regra precisa de contexto.

{
  codigo: "BBDSEO004W",
  categoria: "SEO",
  gravidade: "media",
  penalidade: 8,

  aplicavel(post) {
    return post.palavras >= 500;
  },

  testar(post) {
    return post.linksInternos === 0;
  }
}

O executor deve verificar primeiro se a regra é aplicável.

if (
  typeof regra.aplicavel === "function" &&
  !regra.aplicavel(post)
) {
  continue;
}

Isso evita falsos positivos.


Falsos Positivos: O Inimigo Invisível

Todo scanner automático corre o risco de acusar problemas onde não existem.

Exemplo:

Conteúdo curto

Um post pode possuir apenas 120 palavras porque contém:

  • um vídeo;

  • um infográfico;

  • uma galeria;

  • um aviso rápido;

  • uma imagem histórica.

Outro exemplo:

Sem heading

Um post de 250 palavras pode não precisar de subtítulos.

O motor deve ser conservador.

Melhor classificar uma situação como “revisar” do que afirmar “erro crítico” sem contexto.

A ferramenta deve usar palavras como:

possível
provável
recomendado
sugestão
revisão manual

O Blog Doctor não é juiz.

É perito.


Regras com Evidências

Um diagnóstico fica muito mais útil quando mostra a evidência.

{
  codigo: "BBDHTML002E",
  mensagem: "Tabela localizada dentro de parágrafo",
  evidencia: "<p><table class=\"...\">",
  posicao: 3842
}

Para capturar trechos:

function extrairEvidencia(html, regex, margem = 80) {
  const match = regex.exec(html);

  if (!match) {
    return "";
  }

  const inicio = Math.max(0, match.index - margem);
  const fim = Math.min(
    html.length,
    match.index + match[0].length + margem
  );

  return html.slice(inicio, fim);
}

Isso funciona como o trecho relevante de um dump.

Não precisamos mostrar o HTML inteiro.

Apenas a região onde o problema foi encontrado.


Regras com Seletores DOM

Nem toda regra precisa usar expressão regular.

Quando o HTML é convertido por DOMParser, podemos usar seletores.

const documento = new DOMParser()
  .parseFromString(post.html, "text/html");

Exemplo de imagens sem ALT:

const imagensSemAlt = [
  ...documento.querySelectorAll("img")
].filter(imagem => {
  return !String(
    imagem.getAttribute("alt") || ""
  ).trim();
});

Headings vazios:

const headingsVazios = [
  ...documento.querySelectorAll("h1,h2,h3,h4,h5,h6")
].filter(heading => !heading.textContent.trim());

Mais de um H1:

const multiplosH1 =
  documento.querySelectorAll("h1").length > 1;

O DOM é ideal para estrutura.

Regex é útil para resíduos ou padrões textuais.

Um bom scanner usa ambos.


Um Exemplo Completo de Regra

const regraImagemSemAlt = {
  codigo: "BBDACC001E",
  nome: "Imagem sem texto alternativo",
  categoria: "Acessibilidade",
  gravidade: "alta",
  penalidade: 3,
  penalidadeMaxima: 12,

  aplicavel(post) {
    return post.imagens > 0;
  },

  testar(post) {
    return post.imagensSemAlt > 0;
  },

  quantidade(post) {
    return post.imagensSemAlt;
  },

  mensagem(post, quantidade) {
    return quantidade === 1
      ? "Foi encontrada uma imagem sem atributo ALT"
      : `Foram encontradas ${quantidade} imagens sem atributo ALT`;
  },

  recomendacao:
    "Adicionar texto alternativo objetivo e descritivo às imagens relevantes"
};

Esse formato pode ser copiado para dezenas de novas regras.


Calculando o Score Final

Depois de executar as regras:

const ocorrencias = executarRegras(post, regras);

Somamos as penalidades.

function calcularScore(ocorrencias) {
  const total = ocorrencias.reduce(
    (soma, ocorrencia) =>
      soma + ocorrencia.penalidade,
    0
  );

  return Math.max(0, 100 - total);
}

Resultado:

Score inicial................100
Título curto.................-7
Imagem sem ALT...............-6
Sem links internos...........-8
Resíduo do Word...............-6

Score final...................73

Scores por Categoria

Um único score geral é útil, mas não conta toda a história.

Podemos calcular scores separados.

HTML.........................84
SEO..........................92
Acessibilidade...............70
Conteúdo.....................96
Links........................88

Algoritmo:

function calcularScoresPorCategoria(ocorrencias) {
  const categorias = {};

  for (const ocorrencia of ocorrencias) {
    if (!categorias[ocorrencia.categoria]) {
      categorias[ocorrencia.categoria] = 100;
    }

    categorias[ocorrencia.categoria] -=
      ocorrencia.penalidade;
  }

  for (const categoria in categorias) {
    categorias[categoria] = Math.max(
      0,
      categorias[categoria]
    );
  }

  return categorias;
}

Isso permite entender onde está o problema.

Um post pode ter SEO excelente, mas acessibilidade fraca.

Outro pode possuir HTML limpo, porém quase nenhum link interno.


Classificação por Faixa

O score pode ser convertido em status.

function classificarScore(score) {
  if (score >= 90) return "saudável";
  if (score >= 75) return "atenção";
  if (score >= 60) return "revisão recomendada";
  if (score >= 40) return "degradado";
  return "crítico";
}

Exemplo:

96........Saudável
83........Atenção
67........Revisão recomendada
48........Degradado
29........Crítico

O Equivalente ao Return Code

No z/OS, o código de retorno resume o resultado de uma etapa.

O Blog Doctor pode adotar uma escala própria.

BDC0000 – Nenhum problema relevante
BDC0004 – Alertas informativos ou leves
BDC0008 – Revisão recomendada
BDC0012 – Erros importantes
BDC0016 – Situação crítica

Algoritmo:

function calcularReturnCode(ocorrencias, score) {
  const possuiCritica = ocorrencias.some(
    item => item.gravidade === "critica"
  );

  const possuiAlta = ocorrencias.some(
    item => item.gravidade === "alta"
  );

  if (possuiCritica || score < 40) {
    return "BDC0016";
  }

  if (possuiAlta || score < 60) {
    return "BDC0012";
  }

  if (score < 75) {
    return "BDC0008";
  }

  if (ocorrencias.length > 0) {
    return "BDC0004";
  }

  return "BDC0000";
}

Isso deixa o relatório muito mais familiar para profissionais de mainframe.


Prioridade de Correção

Gravidade individual não basta.

Precisamos considerar também o alcance.

Uma regra pode ocorrer uma vez ou em mil posts.

Podemos calcular prioridade global.

function calcularPrioridadeGlobal(
  gravidade,
  quantidadePosts,
  totalPosts
) {
  const percentual =
    totalPosts > 0
      ? quantidadePosts / totalPosts
      : 0;

  const pesoGravidade = {
    informativa: 0,
    baixa: 1,
    media: 2,
    alta: 3,
    critica: 4
  };

  const pesoVolume =
    percentual >= 0.50 ? 4 :
    percentual >= 0.20 ? 3 :
    percentual >= 0.05 ? 2 :
    quantidadePosts > 0 ? 1 : 0;

  const total =
    pesoGravidade[gravidade] + pesoVolume;

  if (total >= 7) return "crítica";
  if (total >= 5) return "alta";
  if (total >= 3) return "média";
  return "baixa";
}

Exemplo:

Regra................Imagens sem ALT
Posts afetados........1.240
Total do blog..........4.018
Cobertura..............30,86%
Gravidade..............Alta
Prioridade.............Crítica

Configuração Externa das Regras

Em uma versão avançada, os limites não devem ficar fixos no código.

Podemos criar uma configuração.

const configuracao = {
  titulo: {
    minimo: 20,
    maximo: 70
  },
  conteudo: {
    minimoPalavras: 300,
    exigirHeadingAcimaDe: 500
  },
  marcadores: {
    maximo: 12
  },
  seo: {
    scoreSaudavel: 90
  }
};

A regra consulta a configuração.

testar(post, config) {
  return post.titulo.length <
    config.titulo.minimo;
}

Isso permite adaptar o scanner para outros blogs.


Ativando e Desativando Regras

Nem todas as regras serão úteis para todos os usuários.

Uma regra pode possuir:

ativa: true

O executor ignora regras desativadas.

if (regra.ativa === false) {
  continue;
}

Também podemos filtrar por módulo.

const modulosAtivos = new Set([
  "HTML",
  "SEO",
  "Acessibilidade"
]);

Assim o usuário pode realizar:

  • auditoria completa;

  • apenas SEO;

  • apenas HTML;

  • apenas acessibilidade;

  • apenas resíduos.


Regras por Período Histórico

Um blog com quinze anos não pode ser julgado inteiramente pelos padrões atuais.

Um artigo de 2012 foi criado em outro contexto.

Talvez o tema do Blogger inserisse automaticamente estruturas que hoje parecem estranhas.

Podemos criar regras condicionadas ao ano.

{
  codigo: "BBDHTML010I",

  aplicavel(post) {
    return post.publicadoEm.getFullYear() >= 2020;
  },

  testar(post) {
    return post.excessoEstiloInline;
  }
}

Ou reduzir penalidade em conteúdo antigo.

penalidade(post) {
  const ano = post.publicadoEm.getFullYear();

  return ano < 2015 ? 2 : 6;
}

Isso torna o scanner historicamente consciente.


Versionamento das Regras

O Motor de Regras também precisa de versão.

{
  codigo: "BBDSEO001W",
  versao: "1.2.0",
  criadaEm: "2026-07-26",
  alteradaEm: "2026-08-10"
}

Por quê?

Porque o score de um post pode mudar mesmo sem alteração no conteúdo.

Talvez a regra tenha sido ajustada.

Exemplo:

Auditoria de julho
Regra de título curto: mínimo 15 caracteres

Auditoria de setembro
Regra de título curto: mínimo 20 caracteres

Sem registrar a versão, a comparação histórica fica enganosa.


Testando o Motor de Regras

Nenhum motor deve entrar em produção sem testes.

Podemos criar posts simulados.

const postTeste = {
  titulo: "COBOL",
  palavras: 120,
  imagens: 2,
  imagensSemAlt: 2,
  linksInternos: 0,
  marcadores: [],
  residuosIA: 1
};

Depois executamos.

const ocorrencias =
  executarRegras(postTeste, regras);

console.table(ocorrencias);

Resultado esperado:

BBDSEO001W – Título curto
BBDSEO003W – Conteúdo curto
BBDACC001E – Imagens sem ALT
BBDSEO004W – Sem links internos
BBDSEO006W – Sem marcadores
BBDIA001I  – Resíduo de IA

Testes Unitários

Podemos criar pequenas verificações.

function afirmar(condicao, mensagem) {
  if (!condicao) {
    throw new Error(
      "Teste falhou: " + mensagem
    );
  }
}

const resultado =
  executarRegras(postTeste, regras);

afirmar(
  resultado.some(
    item => item.codigo === "BBDSEO001W"
  ),
  "Deveria detectar título curto"
);

Em uma versão profissional, podemos usar Jest, Vitest ou outra biblioteca.

Mas até testes simples já ajudam.


Evitando Regras Duplicadas

O catálogo deve validar códigos duplicados.

function validarCatalogo(regras) {
  const codigos = new Set();

  for (const regra of regras) {
    if (codigos.has(regra.codigo)) {
      throw new Error(
        `Código duplicado: ${regra.codigo}`
      );
    }

    codigos.add(regra.codigo);
  }
}

Também podemos validar campos obrigatórios.

const obrigatorios = [
  "codigo",
  "categoria",
  "gravidade",
  "testar"
];

É como validar um copybook antes de compilar o programa.


Relatório por Regra

Depois de auditar todos os posts, podemos agrupar ocorrências por código.

function agruparPorRegra(postsAuditados) {
  const resumo = new Map();

  for (const post of postsAuditados) {
    for (const ocorrencia of post.ocorrencias) {
      if (!resumo.has(ocorrencia.codigo)) {
        resumo.set(ocorrencia.codigo, {
          codigo: ocorrencia.codigo,
          mensagem: ocorrencia.mensagem,
          gravidade: ocorrencia.gravidade,
          posts: 0,
          ocorrencias: 0
        });
      }

      const item = resumo.get(ocorrencia.codigo);
      item.posts++;
      item.ocorrencias += ocorrencia.quantidade;
    }
  }

  return [...resumo.values()];
}

Relatório:

BBDACC001E
Posts afetados.............312
Ocorrências................487
Gravidade..................Alta

BBDIA001I
Posts afetados..............14
Ocorrências.................62
Gravidade...........Informativa

Relatório por Post

Cada post recebe:

{
  titulo: "ABEND sem Mistérios",
  score: 82,
  returnCode: "BDC0008",
  status: "revisão recomendada",
  ocorrencias: [...]
}

Tabela:

RC        SCORE  TÍTULO
BDC0000     98   Data Division sem Mistérios
BDC0004     88   O Mercado das Linguagens
BDC0008     72   História do COBOL
BDC0012     54   Post antigo importado
BDC0016     31   Página com HTML corrompido

Recomendação Automática

Cada regra deve sugerir uma ação.

Exemplo:

Problema:
Imagem sem ALT

Recomendação:
Adicionar texto alternativo que descreva a finalidade visual da imagem.

Evitar:
alt="imagem"
alt="foto"
alt="banner"

Preferir:
alt="Fluxo de processamento de cartão via CICS"

Para tabela em parágrafo:

Problema:
Tabela encontrada dentro de parágrafo.

Recomendação:
Fechar o elemento <p> antes da tabela e abrir um novo parágrafo depois dela.

A recomendação deve ser prática.

Não basta dizer “corrigir HTML”.


Ações Automáticas Seguras

Algumas correções podem ser sugeridas ou simuladas.

Exemplo:

function sugerirRemocaoResiduoIA(html) {
  return html
    .replace(/\sdata-message-id="[^"]*"/gi, "")
    .replace(/\sdata-message-author-role="[^"]*"/gi, "")
    .replace(/\sdata-message-model-slug="[^"]*"/gi, "");
}

Mas a ferramenta deve apresentar um diff.

ANTES:
<div data-message-id="abc123" class="markdown">

DEPOIS:
<div class="markdown">

Somente após revisão a mudança poderia ser aplicada.


Regras Informativas

Nem toda regra precisa reduzir score.

Exemplo:

{
  codigo: "BBDINF001I",
  categoria: "Informação",
  gravidade: "informativa",
  penalidade: 0,
  testar(post) {
    return post.palavras >= 5000;
  },
  mensagem(post) {
    return `Artigo longo com ${post.palavras} palavras`;
  },
  recomendacao:
    "Considere criar índice interno ou dividir o conteúdo em partes"
}

Essa regra não acusa erro.

Ela oferece contexto.


Regras Positivas

Também podemos reconhecer boas práticas.

{
  codigo: "BBDPOS001I",
  tipo: "bonus",
  categoria: "Qualidade",
  bonus: 3,
  testar(post) {
    return (
      post.palavras >= 1500 &&
      post.linksInternos >= 3 &&
      post.imagensSemAlt === 0
    );
  },
  mensagem:
    "Artigo extenso, interligado e acessível"
}

Nesse caso, o score poderia receber bônus limitado.

Mas é importante impedir valores acima de 100.

score = Math.min(100, score + bonus);

O Motor como uma Espécie de RACF Editorial

O RACF decide:

  • quem pode acessar;

  • qual recurso está protegido;

  • qual regra se aplica;

  • qual decisão deve ser tomada;

  • qual evento será registrado.

O Motor de Regras do Blog Doctor decide:

  • qual análise se aplica;

  • qual condição foi violada;

  • qual gravidade existe;

  • qual mensagem será registrada;

  • qual recomendação será emitida.

Não é segurança no sentido clássico.

Mas a filosofia é semelhante.

Centralização de regras.

Decisões previsíveis.

Auditoria.

Rastreabilidade.


Log da Auditoria

Cada execução pode gerar um log.

22:31:04 BBD0001I AUDIT STARTED
22:31:04 BBD0002I RULESET VERSION 1.0.0
22:31:05 BBD0003I FEED BATCH 1 LOADED
22:31:18 BBD0004I 100 POSTS PROCESSED
22:36:47 BBD0005I 4018 POSTS PROCESSED
22:36:48 BBD0006I REPORT GENERATED
22:36:48 BBD0007I AUDIT COMPLETED RC=0008

Esse log ajuda a investigar falhas do próprio scanner.


Tratamento de Erros nas Regras

Uma regra mal escrita não deve interromper toda a auditoria.

try {
  const resultado = regra.testar(post);
} catch (erro) {
  ocorrencias.push({
    codigo: "BBDENG999E",
    categoria: "Motor",
    gravidade: "alta",
    penalidade: 0,
    mensagem:
      `Falha ao executar a regra ${regra.codigo}`,
    detalhe: erro.message
  });
}

Assim, o sistema continua processando os demais posts.

É o equivalente a isolar uma etapa com erro sem derrubar o job inteiro.


Performance do Motor

Suponha:

4.000 posts
80 regras

Isso significa:

320.000 avaliações

Parece muito, mas boa parte dessas verificações é simples.

Mesmo assim, podemos otimizar.

Primeiro, o HTML deve ser parseado apenas uma vez por post.

Errado:

cada regra cria um novo DOMParser

Correto:

const documento = parsearHTML(post.html);

const contexto = {
  post,
  documento,
  imagens: [...documento.querySelectorAll("img")],
  links: [...documento.querySelectorAll("a[href]")],
  headings: [...documento.querySelectorAll("h1,h2,h3,h4,h5,h6")]
};

Todas as regras usam o mesmo contexto.


O Contexto de Auditoria

Podemos criar um objeto preparado.

function criarContexto(post) {
  const documento = new DOMParser()
    .parseFromString(post.html, "text/html");

  const imagens = [
    ...documento.querySelectorAll("img")
  ];

  const links = [
    ...documento.querySelectorAll("a[href]")
  ];

  const headings = [
    ...documento.querySelectorAll("h1,h2,h3,h4,h5,h6")
  ];

  return {
    post,
    documento,
    imagens,
    links,
    headings,
    imagensSemAlt: imagens.filter(
      img => !String(
        img.getAttribute("alt") || ""
      ).trim()
    )
  };
}

A regra passa a receber o contexto.

testar(contexto) {
  return contexto.imagensSemAlt.length > 0;
}

Isso reduz processamento repetido.


Processamento em Lotes

Mesmo o Motor de Regras deve trabalhar em lotes.

async function auditarEmLotes(
  posts,
  tamanhoLote = 25
) {
  const resultados = [];

  for (
    let inicio = 0;
    inicio < posts.length;
    inicio += tamanhoLote
  ) {
    const lote = posts.slice(
      inicio,
      inicio + tamanhoLote
    );

    resultados.push(
      ...lote.map(auditarPost)
    );

    atualizarProgresso(
      resultados.length,
      posts.length
    );

    await new Promise(
      resolve => setTimeout(resolve, 0)
    );
  }

  return resultados;
}

A pausa permite que o navegador atualize a tela.


Evolução Futura: Regras Declarativas

Em uma versão mais avançada, algumas regras poderiam ser definidas em JSON.

{
  "codigo": "BBDSEO001W",
  "campo": "titulo.length",
  "operador": "<",
  "valor": 20,
  "gravidade": "media",
  "penalidade": 7
}

O motor interpreta a configuração.

Isso permitiria criar regras sem alterar código.

Mas esse modelo possui limites.

Regras complexas ainda precisariam de JavaScript.

O melhor caminho pode ser híbrido:

  • regras simples declarativas;

  • regras complexas programadas.


O Painel de Regras

O dashboard pode mostrar o catálogo ativo.

CÓDIGO       MÓDULO          STATUS
BBDSEO001W   SEO             ATIVA
BBDSEO002W   SEO             ATIVA
BBDACC001E   ACESSIBILIDADE  ATIVA
BBDIA001I    RESÍDUOS        ATIVA
BBDLNK004E   LINKS REMOTOS   DESATIVADA

Também pode permitir:

  • ativar;

  • desativar;

  • alterar limites;

  • consultar documentação;

  • testar uma regra;

  • exportar configuração.


O Relatório Mestre

Ao final, o Motor de Regras poderá produzir algo como:

BELLACOSA BLOG DOCTOR
RELATÓRIO MESTRE DE AUDITORIA

Blog................Bellacosa Mainframe
Posts...............4.018
Regras ativas..........62
Versão...............1.0.0
Return Code.........BDC0008

SCORE GERAL..............91

HTML.....................93
SEO......................94
ACESSIBILIDADE...........84
LINKS.....................89
CONTEÚDO..................96

TOP 5 OCORRÊNCIAS

1. Imagens sem ALT........312 posts
2. Links HTTP..............87 posts
3. Sem link interno........76 posts
4. Resíduo Word............29 posts
5. Resíduo IA..............14 posts

Isso transforma milhares de ocorrências em uma visão operacional.


O Principal Princípio

O Motor de Regras não deve ser criado para punir conteúdo antigo.

Ele deve ser criado para tornar a manutenção possível.

Seu papel é responder:

  • onde estão os riscos?

  • quais são recorrentes?

  • quais são isolados?

  • quais podem ser ignorados?

  • quais merecem prioridade?

  • quais exigem revisão humana?

  • quais podem ser corrigidos com segurança?

Essa é a diferença entre um scanner útil e uma máquina de produzir alarmes.


Conclusão

A Parte V construiu a arquitetura do Bellacosa Blog Doctor.

A Parte VI construiu seu cérebro.

O Motor de Regras transforma dados técnicos em decisões organizadas.

Ele recebe um post.

Cria um contexto de análise.

Executa regras padronizadas.

Registra evidências.

Calcula penalidades.

Agrupa problemas.

Define gravidade.

Gera recomendações.

Calcula score.

Produz um Return Code.

E entrega um laudo que pode ser compreendido por um programador, editor, administrador ou responsável pelo acervo.

O que antes era apenas uma coleção de if espalhados pelo JavaScript se transforma em uma estrutura comparável aos melhores sistemas de diagnóstico corporativo.

Cada regra possui identidade.

Cada alerta possui código.

Cada penalidade possui limite.

Cada diagnóstico possui evidência.

Cada recomendação possui uma ação.

Esse é o momento em que o Bellacosa Blog Doctor deixa de ser apenas um leitor de Feed Atom.

Ele passa a pensar.

Não como uma inteligência artificial misteriosa.

Mas como um bom programa mainframe.

Com regras claras.

Entradas conhecidas.

Saídas previsíveis.

Mensagens padronizadas.

Logs auditáveis.

E uma responsabilidade fundamental:

Nunca declarar um ABEND editorial sem antes mostrar a evidência, o código, a gravidade e o caminho seguro para a recuperação.

🔎 CSI BLOGSPOT · ARQUIVO DE EVIDÊNCIAS

Blog Analytics: A Investigação Completa

Seis capítulos sobre auditoria de HTML, resíduos invisíveis, limpeza segura, checklist técnico e construção do Bellacosa Blog Doctor.

6 relatórios2018HTML · SEO · Blogger
CASE FILE 01

Blog Analytics — Parte I

Como descobrir evidências invisíveis no HTML de um blog antigo.

HTMLAuditoriaBlogspot
CASE FILE 02

Blog Analytics — Parte II

Os resíduos invisíveis deixados por editores, Word, IA e cópias antigas.

ResíduosWord HTMLIA
CASE FILE 03

Blog Analytics — Parte III

Como limpar milhares de posts sem destruir o acervo editorial.

LimpezaBackupQualidade
CASE FILE 04

Blog Analytics — Parte IV

Checklist de auditoria para blogs antigos e acervos com anos de história.

ChecklistSEO TécnicoAuditoria
CASE FILE 05

Blog Analytics — Parte V

Construindo o Bellacosa Blog Doctor e seu scanner automático.

Blog DoctorScannerJavaScript
CASE FILE 06

Blog Analytics — Parte VI

Criando o motor de regras, scores, prioridades e códigos de retorno.

Motor de RegrasScoreMainframe

Índice textual da série Blog Analytics

Esta série investiga a saúde técnica de blogs antigos no Blogger, cobrindo auditoria de HTML, resíduos de editores, SEO técnico, acessibilidade, limpeza segura, diagnóstico automatizado e motores de regras.

  1. Blog Analytics Parte I — Como descobrir evidências invisíveis
  2. Blog Analytics Parte II — Os resíduos invisíveis do HTML
  3. Blog Analytics Parte III — Como limpar com segurança
  4. Blog Analytics Parte IV — Checklist de auditoria
  5. Blog Analytics Parte V — Construindo o Bellacosa Blog Doctor
  6. Blog Analytics Parte VI — Criando o motor de regras

quinta-feira, 2 de agosto de 2018

TOP 20 SANTUÁRIOS MAIS PODEROSOS DO JAPÃO

 

Bellacosa Mainframe apresenta os 20 mais emblematicaos templos e santuarios no Japão

TOP 20 SANTUÁRIOS MAIS PODEROSOS DO JAPÃO

Uma odisséia espiritual ao estilo Bellacosa Mainframe para o blog El Jefe Midnight Lunch

☕⛩️✨ Prepare-se, porque hoje vamos compilar Kami, tradição, mistério e nostalgia na mesma LPAR do coração.

O Japão é o único lugar do mundo onde você pode entrar em uma floresta e sentir que atravessou um portal, uma espécie de exit program que te joga direto em outra LPAR — a espiritual.
Esses portais são os santuários, máquinas espirituais milenares onde Kami e humanos interagem desde antes do “primeiro IPL da história japonesa”.

Hoje apresento o TOP 20 Santuários Mais Poderosos do Japão, com mistérios, histórias, curiosidades e aqueles easter-eggs que só o Bellacosa Mainframe entrega.
Pegue seu café, ajeite o torii mental e vamos embarcar.


Ise Jingu

1 — Ise Jingū (伊勢神宮) – O Coração do Japão

Local: Mie
Kami: Amaterasu-Ōmikami
Por que é poderoso? Considerado o “data center espiritual” do Japão. Renovado a cada 20 anos — o refresh mais elegante da história.
Easter-egg: Só a família imperial pode entrar em certas áreas.


Bellacosa Mainframe visitando Izumo Taisha

2 — Izumo Taisha (出雲大社) – A Sala de Conferências dos Kami

Izumo Taisha


Local: Shimane
Kami: Ōkuninushi
Poder: Diz a lenda que todos os Kami do Japão se reúnem aqui todo outubro.
Curiosidade: É o santuário dos relacionamentos — nível “APIs românticas”.


Bellacosa Mainframe visitando Fushimi Inari Taisha

3 — Fushimi Inari Taisha (伏見稲荷大社) – O Labirinto dos 10.000 Torii

Fushimi Inari Taisha


Local: Kyoto
Kami: Inari
Poder: Prosperidade e sucesso — ideal para quem quer sobreviver ao mercado de TI.
Easter-egg: Os torii são patrocinados por empresas ao estilo “mainframe naming rights”.



4 — Meiji Jingū (明治神宮) – O Santuário da Transição

Local: Tóquio
Kami: Imperador Meiji
Curiosidade: Um dos santuários mais silenciosos mesmo estando ao lado de Shibuya. Milagre puro.



5 — Tsurugaoka Hachimangū (鶴岡八幡宮) – O Santuário dos Samurais

Local: Kamakura
Kami: Hachiman
Poder: Protetor dos guerreiros — até hoje atrai artes marciais.
Comentário: Se houvesse COBOL de samurai, seria compilado aqui.


6 — Itsukushima Jinja (厳島神社) – O Torii que Flutua

Local: Hiroshima
Kami: Ichikishimahime
Mistério: Torii flutua há séculos — sustentado pela fé e engenharia ninja.


7 — Suwa Taisha (諏訪大社) – O Santuário dos Deuses da Guerra e do Raio

Local: Nagano
Curiosidade: Um dos mais antigos, sem torii na entrada — estilo “raw access”.


8 — Kasuga Taisha (春日大社) – O Santuário das Lanternas Eternas

Local: Nara
Easter-egg: 3 mil lanternas só acesas duas vezes por ano.
Poder: Fertilidade, paz e boa colheita.


9 — Kifune Jinja (貴船神社) – O Santuário da Chuva

Local: Kyoto
Mistério: Antigo local para prever clima — os primeiros “meteorologistas espirituais”.


Kumano Hongu Taisha

10 — Kumano Hongū Taisha (熊野本宮大社) – O Caminho das Mil Orações

Local: Wakayama
Poder: Cura espiritual; destino final de peregrinos milenares.


Nikko Toshhogu

11 — Nikko Tōshōgū (日光東照宮) – O Santuário do Shogun Imortal

Local: Tochigi
Kami: Tokugawa Ieyasu
Curiosidade: O famoso trio “não vejo, não falo, não ouço o mal”.


Usa Jingu

12 — Usa Jingū (宇佐神宮) – O Hachiman Original

Local: Oita
Poder: Um dos berços do culto samurai.


Omiwa Shrine

13 — Ōmiwa Shrine (大神神社) – A Montanha Sagrada Sem Edifício

Local: Nara
Mistério: Não tem salão principal — o próprio monte Miwa é o Kami.
Comentário: Minimalismo espiritual extremo. Quase zen-bare-metal.


Nachi Taisha

14 — Nachi Taisha (熊野那智大社) – O Santuário da Cachoeira Gigante

Local: Wakayama
Curiosidade: Uma das quedas d’água mais poderosas do país — 133 metros.


Atsuta Jingu

15 — Atsuta Jingū (熱田神宮) – O Santuário da Espada Sagrada

Local: Aichi
Easter-egg: Abriga a Kusanagi-no-Tsurugi — a Excalibur japonesa.


Hie Shrine

16 — Hie Shrine (日枝神社) – O Guardião de Tóquio

Local: Tóquio
Poder: Protege negócios e políticos — firewall espiritual da capital.


Yoshida Shrine

17 — Yoshida Shrine (吉田神社) – O Santuário dos Exorcistas

Local: Kyoto
Comentário: Local famoso por rituais contra epidemias desde o século X.
Poder: Sistema antivírus espiritual.


Hakone Shrine

18 — Hakone Shrine (箱根神社) – O Protetor das Estradas

Local: Kanagawa
Curiosidade: Viajeros e samurais paravam aqui para “refazer o buff”.
Easter-egg: Torii no lago Ashi vira cenário de anime direto.


Kanda Myojin

19 — Kanda Myōjin (神田明神) – O Santuário dos Gamers e Programadores

Local: Tóquio (Akihabara)
Kami: Daikokuten, Ebisu, Taira no Masakado
Poder: Sucesso financeiro + proteção digital
Comentário:
Sim, é o santuário oficial da galera de TI.
Sim, dá para comprar amuletos para proteger seu servidor.


Zeniarai Benten

20 — Zeniarai Benten (銭洗弁天) – O Santuário que Multiplica Dinheiro

Local: Kamakura
Curiosidade: Você literalmente lava dinheiro (de verdade) e reza para que multiplique.
Easter-egg: Uma caverna, água pura e um Kami que parece CFO espiritual.


Considerações Bellacosa Mainframe

O Japão é mais do que templos, torii e tradições.
É um gigantesco ecossistema espiritual, um mainframe natural onde:

  • cada montanha é memória,

  • cada árvore é história,

  • cada vento é software ancestral,

  • e cada santuário é um endpoint onde o humano toca o divino.

Alguns desses lugares emanam tanto “campo espiritual” que parecem um IMS apoiado por um z/OS emocional.

Quando você visitar um desses 20 santuários, não vá como turista.
Vá como se estivesse acessando um sistema legado milenar — com respeito, curiosidade e aquela reverência que só quem já enfrentou um JCL rebelde entende.

quarta-feira, 1 de agosto de 2018

☕🚀 PADAWAN, O QUE É HAIKU? A POESIA JAPONESA QUE CABE EM 17 SÍLABAS E UM UNIVERSO INTEIRO

 

Bellacosa Mainframe e a linda poesia haiku

☕🚀 PADAWAN, O QUE É HAIKU? A POESIA JAPONESA QUE CABE EM 17 SÍLABAS E UM UNIVERSO INTEIRO

O QUE É HAIKU?

Imagine que você precisasse descrever um pôr do sol, uma flor de cerejeira caindo ou até mesmo uma madrugada no Data Center do Santander usando apenas 17 sílabas.

Difícil?

Pois foi exatamente esse desafio que os japoneses transformaram em arte.

O Haiku é uma das formas mais famosas da literatura japonesa. Pequeno no tamanho, gigantesco no significado, ele busca capturar um instante da vida, uma emoção ou uma observação da natureza com o mínimo possível de palavras.

Segundo a tradição japonesa, um haiku possui três versos organizados em uma estrutura 5-7-5, totalizando 17 unidades sonoras (on), frequentemente traduzidas como sílabas. Normalmente também inclui uma referência à estação do ano (kigo), elemento muito importante na cultura japonesa.


A FILOSOFIA DO HAIKU

No Ocidente, costumamos acreditar que quanto maior um texto, mais profunda é sua mensagem.

Os japoneses frequentemente seguem a direção oposta.

O haiku procura sugerir.

Ele não explica.

Não argumenta.

Não convence.

Ele mostra uma cena e deixa o leitor completar o significado.

É quase como uma fotografia literária.


O MESTRE DOS MESTRES: MATSUO BASHŌ

Quando falamos de haiku, existe um nome obrigatório:

Matsuo Bashō (1644-1694).

Seu haiku mais famoso atravessou séculos:

Velha lagoa

Um sapo salta nela

Som da água

Esse poema é considerado um dos maiores exemplos da simplicidade e profundidade do haiku.

Observe que aparentemente "nada acontece".

Mas acontece tudo.

Silêncio.
Movimento.
Som.
Natureza.
Tempo.

Em apenas três linhas.


O HAIKU E O MAINFRAME

Agora vamos traduzir isso para o universo Bellacosa Mainframe.

Um bom haiku não descreve uma operação inteira do banco.

Ele captura um instante.

Por exemplo:

Tela verde acesa

Milhões passam invisíveis

Banco não dorme


Outro:

Job terminou

Operador sorri sozinho

Sol já nasceu


Mais um:

Luz do console

JES2 acorda primeiro

Cidade dorme


HAIKU NÃO É FRASE CURTA

Esse é um erro comum.

Frase curta não é haiku.

Veja:

"Hoje estou feliz."

Curto?

Sim.

Haiku?

Não.

Agora:

Chuva na janela

O café ainda fumega

Domingo lento

Aqui existe:

  • cenário

  • sensação

  • momento

  • imagem mental

Isso se aproxima muito mais da essência do haiku.


HAIKU, SENRYU E A CONFUSÃO DOS INICIANTES

Existe um primo do haiku chamado Senryu.

Os dois possuem estrutura parecida.

A diferença principal é:

Haiku:

  • natureza

  • estações

  • contemplação

Senryu:

  • comportamento humano

  • humor

  • ironia

Exemplo de Senryu estilo TI:

Mudou produção

Quem fez a alteração?

Todos sumiram

O foco aqui não é a natureza.

É a comédia humana.

Por isso seria mais próximo de um Senryu do que de um Haiku.


COMO ESCREVER SEU PRIMEIRO HAIKU

Método Bellacosa:

Passo 1:
Observe algo simples.

Exemplos:

  • café

  • chuva

  • madrugada

  • terminal 3270

  • janela

  • lua

Passo 2:
Capture um instante.

Não conte uma história inteira.

Passo 3:
Remova palavras desnecessárias.

Passo 4:
Leia em voz alta.

Se parecer uma fotografia mental, você está no caminho certo.


EXEMPLOS PARA MAINFRAMEIROS

COBOL

Código antigo

Jovem analista aprende

Legado respira


CICS

Tela respondeu

Milissegundos bastaram

Cliente sorriu


JCL

Cartão perfurado

Ecoando no presente

Job executa


RACF

Porta protegida

Tentativas ficam fora

Silêncio seguro


HAIKU NOS ANIMES

O haiku aparece com frequência em animes por fazer parte da cultura japonesa.

Alguns exemplos interessantes:

1. Chio's School Road (2018)

Título original:
Chio-chan no Tsuugakuro

Lançamento:
Julho de 2018.

Personagens principais:

  • Chio Miyamo

  • Manana Nonomura

Em um dos episódios existe uma brincadeira envolvendo a criação e interpretação de haikus, explorando o contraste entre a formalidade da poesia tradicional e o humor absurdo da série.


2. Non Non Biyori (2013)

Personagens:

  • Renge Miyauchi

  • Hotaru Ichijou

  • Komari Koshigaya

  • Natsumi Koshigaya

Sinopse:

Um anime contemplativo sobre a vida rural japonesa.

Embora não seja centrado em haikus, a obra frequentemente utiliza a mesma estética contemplativa, valorizando estações do ano, silêncio, natureza e momentos efêmeros — exatamente os pilares da tradição do haiku.


3. Barakamon (2014)

Personagens:

  • Seishuu Handa

  • Naru Kotoishi

Sinopse:

Um jovem calígrafo se muda para uma ilha remota para redescobrir sua arte.

A série explora profundamente conceitos estéticos japoneses como simplicidade, contemplação e observação da natureza, elementos intimamente ligados à tradição do haiku.


4. Mushishi (2005)

Personagens:

  • Ginko

Sinopse:

Ginko viaja estudando seres sobrenaturais chamados Mushi.

O ritmo lento, contemplativo e a valorização dos fenômenos naturais fazem muitos críticos compararem episódios inteiros a haikus visuais. A narrativa captura momentos breves e profundos da mesma forma que um poema de Bashō faria.


5. Chihayafuru (2011)

Personagens:

  • Chihaya Ayase

  • Taichi Mashima

  • Arata Wataya

Sinopse:

Embora o foco seja o Karuta e a poesia clássica japonesa (Waka), o anime apresenta ao público a tradição poética japonesa que posteriormente influenciou o surgimento do haiku moderno.


DESAFIO DO PADAWAN

Escreva um haiku sobre sua vida no Mainframe.

Exemplo:

Dump inesperado

Analista busca pistas

Aurora chegou

Ou:

Café na mesa

COBOL vence mais um dia

Legado vive


bellacosa mainframe apresenta um dos mais belos haiku

Não existe um consenso absoluto sobre qual é o haiku mais bonito do mundo, mas o mais famoso, estudado e frequentemente apontado como o mais perfeito já escrito é o de Matsuo Bashō (1644–1694).

Original em Japonês

古池や
蛙飛びこむ
水の音

Romaji

Furu ike ya
kawazu tobikomu
mizu no oto


Tradução Literal

Velho lago.

Uma rã mergulha.

Som da água.


Tradução Poética

Na velha lagoa

salta uma rã

som da água


Por que ele é tão admirado?

Porque em apenas 17 sílabas sonoras japonesas ele reúne:

  • Silêncio
  • Movimento
  • Tempo
  • Natureza
  • Eternidade
  • O instante presente

A lagoa representa a quietude.

O salto da rã representa a mudança.

O som da água representa o momento em que o universo interrompe o silêncio.

É um poema simples para uma criança e profundo para um filósofo.


Outro candidato ao mais belo haiku

Também de Bashō:

夏草や
兵どもが
夢の跡

Romaji

Natsukusa ya
tsuwamonodomo ga
yume no ato

Tradução

Ervas de verão.

Restam apenas os sonhos

dos antigos guerreiros.


Significado

Bashō visitou o local onde havia ocorrido uma grande batalha samurai séculos antes.

Ao chegar, não encontrou castelos, exércitos ou heróis.

Apenas ervas crescendo.

Toda a glória humana havia desaparecido.

Somente a natureza permanecia.


Haiku favorito dos amantes da lua

名月や
池をめぐりて
夜もすがら

Romaji

Meigetsu ya
ike o megurite
yo mo sugara

Tradução

Lua magnífica.

Contorno o lago inteiro

durante toda a noite.


Versão Bellacosa Mainframe ☕🚀

Se Bashō trabalhasse num Data Center:

Tela verde.

Milhões cruzam silenciosos.

Pisca o cursor.


Ou:

Job da madrugada.

O operador toma café.

Nasce o domingo.


Ou ainda:

Dump inesperado.

A equipe busca respostas.

Canta um sabiá.


Talvez a maior lição do haiku seja esta:

O universo não cabe em muitas palavras.

Às vezes ele cabe em três linhas. ☕🚀

CONCLUSÃO

Padawan, o haiku nos ensina algo que falta em boa parte da tecnologia moderna:

Nem sempre mais linhas significam mais valor.

Às vezes, três linhas bastam.

Assim como um bom programa COBOL.

Poucas instruções.

Muita eficiência.

Muito significado.

E quase nenhuma memória desperdiçada.

☕🚀


Vagner Renato Bellacosa, IBM Champion e especialista em IBM Mainframe
IBM Z17 SYSTEM ONLINE
Sobre o autor

Vagner Renato Bellacosa

IBM Champion 2026 • Especialista em IBM Mainframe

Vagner Renato Bellacosa trabalha com IBM Mainframe desde 1988 , é IBM Champion e especialista em COBOL, CICS, Db2, z/OS e IBM Z. Compartilha experiências profissionais, conhecimento técnico, história da computação e práticas do universo mainframe para aproximar novas gerações das tecnologias que sustentam empresas, bancos e governos ao redor do mundo.

IBM Champion IBM Z COBOL CICS Db2 z/OS Mainframe desde 1988
GitHub LinkedIn
Inicializando conteúdo...