☕ Um Café no Bellacosa Mainframe
Gostou do conteúdo? Ajude a manter o café quente, o COBOL compilando e o mainframe acordado. 😄
☕ Pague um café ao Bellacosa

Translate

sábado, 10 de junho de 2023

⚔️ YUUYA TENJOU E A DUNGEON DAS ARROW FUNCTIONS — QUANDO O COBOL ENCONTROU A SETA =>

 

Bellacosa Mainframe apresenta o Arrow Function e Lambda Functions

☕ Um Café no Bellacosa Mainframe

⚔️ YUUYA TENJOU E A DUNGEON DAS ARROW FUNCTIONS — QUANDO O COBOL ENCONTROU A SETA =>

Lambda, Arrow Functions, programação funcional, callbacks, map, filter, reduce, pipelines, legibilidade, carga cognitiva — e o dia em que um programador COBOL descobriu que x => x * 2 não era uma tentativa de economizar caracteres no teclado.



🎬 PRÓLOGO — YUUYA ENCONTROU UMA PORTA ESTRANHA

Todo programador possui uma porta para outro mundo.

Para Yuuya Tenjou, em Isekai de Cheat Skill, foi literalmente uma passagem para outro mundo.

Para um programador COBOL, às vezes basta abrir um programa JavaScript moderno.

Você entra inocentemente esperando encontrar variáveis, condições, loops e funções.

De repente aparece:

clientes
    .filter(c => c.ativo)
    .map(c => c.nome)
    .sort((a, b) => a.localeCompare(b));

O programador COBOL observa aquilo durante alguns segundos.

Depois mais alguns.

Finalmente pergunta:

— Cadê o IF?

Silêncio.

— Cadê o PERFORM?

Nada.

— Cadê o END-IF?

Apenas uma seta olhando para ele:

=>

Bem-vindo à Dungeon das Arrow Functions.

O objetivo deste artigo não é convencer você de que arrow functions são maravilhosas, nem dizer que programação funcional é superior ao COBOL.

Nosso objetivo é muito mais interessante:

entender por que essa maneira de programar existe, que problema ela resolve e, principalmente, como um programador acostumado ao pensamento COBOL pode aprender a lê-la rapidamente.

Pegue o café.

Yuuya abriu a porta.

Nós vamos entrar.



🏰 CAPÍTULO 1 — COBOL FOI FEITO PARA SER LIDO

Existe uma razão histórica para um programador COBOL estranhar JavaScript moderno.

Veja:

IF WS-IDADE >= 18
    DISPLAY 'ADULTO'
END-IF

Mesmo alguém com pouco conhecimento de COBOL consegue imaginar o que está acontecendo.

Há uma condição.

Há uma ação.

Há um encerramento explícito.

Compare com:

p => p.idade >= 18

A primeira impressão pode ser:

— Isso não foi construído para humanos.

Na realidade, foi construído para humanos que já dominam determinado vocabulário.

Esse detalhe é importante.

Quando você lê:

PERFORM VARYING IDX FROM 1 BY 1
    UNTIL IDX > WS-TOTAL

um iniciante também pode achar estranho.

Mas depois de anos trabalhando com COBOL, seu cérebro não interpreta individualmente:

PERFORM
VARYING
FROM
BY
UNTIL

Você reconhece um padrão inteiro:

LOOP.

É exatamente isso que precisa acontecer com:

x => x * 2

O objetivo não é interpretar cada símbolo.

O objetivo é reconhecer o padrão.



🧙 CAPÍTULO 2 — PRIMEIRA MAGIA DE YUUYA: => SIGNIFICA RECEBE E DEVOLVE

Vamos estabelecer nosso primeiro cheat skill.

Sempre que encontrar:

x => expressão

leia mentalmente:

RECEBE x E DEVOLVE expressão.

Portanto:

x => x * 2

vira:

recebe x e devolve x * 2.

Isso:

idade => idade >= 18

vira:

recebe idade e devolve verdadeiro se idade for maior ou igual a 18.

Isso:

cliente => cliente.ativo

vira:

recebe cliente e devolve o estado de cliente.ativo.

E:

(a, b) => a + b

significa:

recebe a e b e devolve a soma dos dois.

Pronto.

A seta perdeu boa parte da magia.



⚔️ CAPÍTULO 3 — LAMBDA NÃO É ARROW FUNCTION

Antes de avançarmos, precisamos separar dois conceitos.

Lambda é uma ideia.

Arrow function é uma sintaxe.

O conceito de funções lambda é muito anterior ao JavaScript moderno e está relacionado ao cálculo lambda desenvolvido por Alonzo Church na década de 1930.

O cálculo lambda tornou-se uma das bases teóricas da ciência da computação e influenciou profundamente linguagens funcionais.

JavaScript apenas oferece uma maneira compacta de escrever determinadas funções.

Compare:

function dobrar(numero) {
    return numero * 2;
}

com:

numero => numero * 2

A segunda forma é uma arrow function.

Conceitualmente ambas representam comportamento:

ENTRADA
   |
   V
numero
   |
   V
numero * 2
   |
   V
SAÍDA

A diferença principal aqui é a quantidade de cerimônia sintática.



🧠 CAPÍTULO 4 — POR QUE ALGUÉM QUIS DIMINUIR AS FUNÇÕES?

Imagine que precisamos filtrar clientes adultos.

Poderíamos escrever:

function clienteAdulto(cliente) {
    return cliente.idade >= 18;
}

const adultos = clientes.filter(clienteAdulto);

Isso é perfeitamente válido.

Mas talvez essa função seja usada somente naquele ponto.

Então podemos escrever:

const adultos =
    clientes.filter(cliente => cliente.idade >= 18);

A função foi criada exatamente onde é necessária.

Essa é uma das grandes vantagens das lambdas:

comportamentos pequenos podem ser definidos e passados diretamente para outras operações.

Em outras palavras, funções passam a ser tratadas como valores.

Podemos passar uma função para outra função.

Esse conceito recebe frequentemente o nome de funções de primeira classe.


📦 CAPÍTULO 5 — QUANDO O COMPORTAMENTO VIRA DADO

Aqui começa a parte realmente importante.

Um programador COBOL está acostumado com algo semelhante a:

PERFORM VALIDAR-CLIENTE

Existe uma rotina chamada VALIDAR-CLIENTE.

Agora imagine que pudéssemos entregar essa rotina para outra rotina dizendo:

Tome esta regra e execute-a para cada elemento.

É aproximadamente isso que acontece aqui:

clientes.filter(clienteAdulto);

Estamos entregando clienteAdulto para filter.

Mas também podemos criar a regra diretamente:

clientes.filter(
    cliente => cliente.idade >= 18
);

filter recebe comportamento.

Isso permite construir abstrações extremamente poderosas.


🏭 CAPÍTULO 6 — O COBOLZEIRO PENSA EM PERFORM

Imagine:

MOVE ZERO TO WS-CONTADOR

PERFORM VARYING IDX FROM 1 BY 1
    UNTIL IDX > WS-TOTAL

    IF CLIENTE-ATIVO(IDX) = 'S'
        ADD 1 TO WS-CONTADOR
    END-IF

END-PERFORM

Aqui estamos descrevendo explicitamente o mecanismo:

  1. inicializar;

  2. criar índice;

  3. incrementar índice;

  4. testar limite;

  5. acessar elemento;

  6. testar condição;

  7. executar ação.

Isso é pensamento imperativo.

Estamos dizendo:

computador, faça isso, depois aquilo, depois aquilo.

Agora observe:

clientes.filter(cliente => cliente.ativo);

Aqui estamos mais próximos de:

Dos clientes, quero aqueles que estão ativos.

Não especificamos explicitamente como percorrer a coleção.

filter já sabe fazer isso.

Nós fornecemos apenas a regra.

Essa diferença é fundamental.


🔮 CAPÍTULO 7 — IMPERATIVO VERSUS DECLARATIVO

Simplificando bastante:

Imperativo

Descreve como fazer.

PEGUE REGISTRO
TESTE
SE ACEITO
   MOVA
INCREMENTE
VOLTE

Declarativo

Descreve mais diretamente o que queremos.

FILTRAR CLIENTES ATIVOS

Programação funcional frequentemente permite aproximar o código dessa segunda maneira de pensar.

Isso não significa que uma seja universalmente melhor.

Significa que estamos trabalhando em níveis diferentes de abstração.


🗺️ CAPÍTULO 8 — O COPYBOOK SECRETO DAS FUNÇÕES FUNCIONAIS

Yuuya encontra agora um pergaminho escondido na dungeon.

Nele estão apenas sete palavras.

Memorize-as:

FILTER = QUEM FICA?

MAP = VIRA O QUÊ?

FIND = QUAL DELES?

SOME = EXISTE ALGUM?

EVERY = TODOS?

REDUCE = ACUMULA COMO?

SORT = COMPARA COMO?

Esse pequeno mapa muda completamente a maneira de ler JavaScript moderno.


🧹 CAPÍTULO 9 — FILTER: QUEM PASSA PELO PORTÃO?

Considere:

clientes.filter(
    cliente => cliente.idade >= 18
);

Não comece pela lambda.

Veja primeiro:

filter

Pergunte:

Quem fica?

Agora leia:

cliente => cliente.idade >= 18

Resposta:

clientes cuja idade seja maior ou igual a 18.

filter funciona como uma peneira.

Entrada:

Ana     15
Maria   27
João    17
Carlos  44

Regra:

IDADE >= 18

Saída:

Maria   27
Carlos  44

A lambda usada por filter normalmente produz:

TRUE

ou:

FALSE

TRUE passa.

FALSE fica para trás.


🪄 CAPÍTULO 10 — MAP: TRANSFORME UMA COISA EM OUTRA

Agora:

clientes.map(cliente => cliente.nome);

Pergunta:

Vira o quê?

Cada cliente vira seu nome.

Entrada:

[
    { nome: "Ana", idade: 30 },
    { nome: "Maria", idade: 41 }
]

Saída:

[
    "Ana",
    "Maria"
]

Pense:

CLIENTE --------> NOME
CLIENTE --------> NOME
CLIENTE --------> NOME

map é uma transformação.


🔎 CAPÍTULO 11 — FIND: ENCONTRE UM REGISTRO

clientes.find(
    cliente => cliente.id === 123
);

Leia:

encontre o cliente cujo ID seja 123.

Mentalmente, isso é muito próximo de procurar um registro por determinada condição.

O interessante é que não precisamos escrever explicitamente toda a lógica de iteração.


🧪 CAPÍTULO 12 — SOME E EVERY

Veja:

clientes.some(cliente => cliente.bloqueado);

Pergunta:

Existe algum cliente bloqueado?

Agora:

clientes.every(cliente => cliente.ativo);

Pergunta:

Todos os clientes estão ativos?

Esse vocabulário começa a tornar o código surpreendentemente expressivo depois que você aprende a lê-lo semanticamente.


👹 CAPÍTULO 13 — YUUYA ENCONTRA O BOSS: REDUCE

E finalmente chegamos ao monstro que assusta muita gente:

pedidos.reduce(
    (acc, pedido) => acc + pedido.valor,
    0
);

O COBOLzeiro olha:

— Agora vocês passaram dos limites.

Calma.

Vamos desmontar.

O 0 é o valor inicial.

Portanto:

ACC = 0

Depois:

(acc, pedido) => acc + pedido.valor

significa:

recebe acumulador e pedido e devolve acumulador + valor do pedido.

Em COBOL conceitualmente teríamos:

MOVE ZERO TO WS-TOTAL

PERFORM VARYING IDX FROM 1 BY 1
    UNTIL IDX > WS-QTD-PEDIDOS

    ADD PEDIDO-VALOR(IDX)
        TO WS-TOTAL

END-PERFORM

Portanto:

pedidos.reduce(
    (total, pedido) => total + pedido.valor,
    0
);

é essencialmente:

TOTAL = TOTAL + PEDIDO-VALOR

repetido para todos os pedidos.

O dragão morreu.


🏗️ CAPÍTULO 14 — O PODER REAL ESTÁ NO PIPELINE

Agora podemos juntar tudo:

const total =
    pedidos
        .filter(pedido => pedido.status === "PAGO")
        .map(pedido => pedido.valor)
        .reduce(
            (total, valor) => total + valor,
            0
        );

Não tente ler cada símbolo.

Primeiro veja:

PEDIDOS
   |
FILTER
   |
MAP
   |
REDUCE

Agora pergunte:

FILTER

Quem fica?

PEDIDOS PAGOS

MAP

Vira o quê?

PEDIDO → VALOR

REDUCE

Acumula como?

SOMA

Então o algoritmo inteiro significa:

Pegue os pedidos pagos, transforme-os em valores e some esses valores.


🖥️ CAPÍTULO 15 — ISSO PARECE MAIS MAINFRAME DO QUE VOCÊ IMAGINA

Podemos imaginar:

INPUT DATASET
      |
      V
    FILTER
      |
      V
 TRANSFORMATION
      |
      V
 AGGREGATION
      |
      V
   OUTPUT

Familiar?

Muito.

Um pipeline:

dados
    .filter(...)
    .map(...)
    .reduce(...)

pode ser mentalmente interpretado como uma sequência de etapas de processamento.

É quase como observar um fluxo batch.

Você primeiro identifica:

INPUT
STEP01
STEP02
STEP03
OUTPUT

Depois entra em cada etapa.

Essa é uma excelente estratégia para um programador mainframe.


📞 CAPÍTULO 16 — CALLBACK: TOME ESTA ROTINA E CHAME DEPOIS

Arrow functions aparecem muito em callbacks.

Veja:

setTimeout(() => {
    console.log("Olá");
}, 1000);

Primeiro:

() => {
    console.log("Olá");
}

significa:

função que não recebe parâmetros e imprime "Olá".

Agora:

setTimeout(FUNCAO, 1000);

significa aproximadamente:

execute essa função depois de 1000 milissegundos.

Poderíamos escrever:

function dizerOla() {
    console.log("Olá");
}

setTimeout(dizerOla, 1000);

A arrow function evita criar um nome para uma rotina utilizada apenas naquele ponto.


⚠️ CAPÍTULO 17 — MENOS CARACTERES NÃO SIGNIFICA MELHOR CÓDIGO

Agora Yuuya encontra uma armadilha.

Veja:

x => x.a > 10

Curto?

Sim.

Legível?

Depende.

O que é x?

O que é a?

Por que 10?

Compare:

cliente =>
    cliente.saldo > LIMITE_CREDITO

Muito melhor.

A arrow function não era o problema.

O problema eram os nomes.

Essa é uma lição extremamente importante.

Código compacto não é necessariamente código simples.


🧠 CAPÍTULO 18 — COMPRESSÃO DE CÓDIGO E DESCOMPRESSÃO CEREBRAL

Imagine:

x.filter(a=>a.b).map(c=>c.d).reduce((e,f)=>e+f,0)

Poucos caracteres.

Mas o cérebro precisa descobrir:

x = ?
a = ?
b = ?
c = ?
d = ?
e = ?
f = ?

Economizamos digitação e transferimos o custo para quem lê.

É como compactar o programa.

O desenvolvedor precisa executar mentalmente:

UNZIP ALGORITMO

antes de poder entendê-lo.

Código de produção vive muito mais tempo sendo lido do que sendo digitado.

Isso vale para COBOL.

Vale para JavaScript.

Vale para Java.

Vale para Python.

E valerá para a próxima linguagem da moda.


🧱 CAPÍTULO 19 — QUANDO NÃO USAR UMA LAMBDA GIGANTESCA

Isto é aceitável:

pedidos.filter(pedido => pedido.ativo);

Mas considere:

pedidos.filter(pedido =>
    pedido.ativo &&
    pedido.valor > 1000 &&
    pedido.cliente?.status !== "BLOQUEADO" &&
    pedido.itens.some(item => item.quantidade > 0)
);

Ainda funciona.

Mas talvez seja melhor escrever:

function pedidoElegivel(pedido) {
    return (
        pedido.ativo &&
        pedido.valor > 1000 &&
        pedido.cliente?.status !== "BLOQUEADO" &&
        pedido.itens.some(
            item => item.quantidade > 0
        )
    );
}

pedidos.filter(pedidoElegivel);

Agora o algoritmo principal diz:

filtre pedidos elegíveis.

A regra de elegibilidade está isolada.

Isso lembra muito:

PERFORM VALIDAR-PEDIDO

em vez de colocar 47 condições no meio do processamento principal.


🧭 CAPÍTULO 20 — O MÉTODO YUUYA PARA LER LAMBDAS

Encontrou:

usuarios
    .filter(u => u.ativo)
    .map(u => ({
        nome: u.nome,
        total: u.pedidos.reduce(
            (a, p) => a + p.valor,
            0
        )
    }))
    .filter(u => u.total > 1000);

Não entre em pânico.

Faça quatro passagens.

PASSO 1 — IDENTIFIQUE A ENTRADA

usuarios

Estamos trabalhando com usuários.

PASSO 2 — IGNORE AS LAMBDAS

Leia somente:

FILTER
MAP
FILTER

Já temos:

USUÁRIOS
   |
 FILTRAR
   |
TRANSFORMAR
   |
 FILTRAR

PASSO 3 — ABRA AS REGRAS EXTERNAS

Primeiro:

u => u.ativo

Somente usuários ativos.

Depois:

u => ({
    nome: u.nome,
    total: ...
})

Transforma usuário em:

NOME + TOTAL

Depois:

u => u.total > 1000

Mantém total superior a 1000.

PASSO 4 — ENTRE NA LAMBDA INTERNA

u.pedidos.reduce(
    (a, p) => a + p.valor,
    0
)

Tradução:

some os valores dos pedidos.

Resultado final:

USUÁRIOS
     |
     V
SOMENTE ATIVOS
     |
     V
CALCULAR NOME + TOTAL DOS PEDIDOS
     |
     V
TOTAL > 1000

Agora o código deixou de ser hieróglifo.


⚡ CAPÍTULO 21 — NÃO EXECUTE O PROGRAMA INTEIRO NA CABEÇA

Essa talvez seja a melhor dica deste artigo.

Programadores experientes não necessariamente entendem código complexo porque conseguem simular cinquenta instruções simultaneamente.

Eles reconhecem padrões.

Um operador de mainframe experiente olha:

IEFBR14

e não precisa analisar cada caractere.

Um programador COBOL olha:

PERFORM VARYING

e reconhece imediatamente um padrão.

Queremos construir o mesmo reflexo:

.filter(...)

→ seleção.

.map(...)

→ transformação.

.reduce(...)

→ agregação.

Depois disso, sua velocidade de leitura aumenta enormemente.


🎒 CAPÍTULO 22 — A DUNGEON TEM NÍVEIS DE ABSTRAÇÃO

Uma das grandes mudanças da programação moderna é o aumento do nível de abstração.

Antigamente poderíamos escrever:

PEGUE ELEMENTO
COMPARE
INCREMENTE
COPIE
VOLTE

Hoje escrevemos:

filter(...)

Isso não significa que o loop desapareceu.

Ele foi encapsulado.

Esse conceito é importantíssimo.

Abstração não elimina trabalho.

Abstração esconde implementação atrás de uma interface.

Quando fazemos:

SELECT *
FROM CLIENTES
WHERE ATIVO = 'S';

também não especificamos como o banco deve percorrer fisicamente cada página.

O SGBD resolve.

Um COBOLzeiro já trabalha com abstrações há décadas.

Talvez apenas não chamasse dessa maneira.


📜 CAPÍTULO 23 — CURIOSIDADE: COBOL TAMBÉM É UMA GRANDE ABSTRAÇÃO

Imagine explicar para um programador Assembly de décadas atrás:

ADD WS-VALOR TO WS-TOTAL

Ele poderia responder:

— Preguiçosos! Cadê os registradores?

😂

Toda geração acha que a próxima está escondendo detalhes demais.

Assembly abstraiu código de máquina.

COBOL abstraiu muitos detalhes da máquina.

SQL abstraiu mecanismos de acesso aos dados.

Bibliotecas abstraíram algoritmos.

Frameworks abstraíram infraestrutura.

filter, map e reduce abstraem padrões de iteração.

A história da programação é, em boa medida, a história da criação de abstrações.


🥚 EASTER EGG — 03:17 NA DUNGEON

Às 03:17, Yuuya encontra um programa:

const incidente =
    eventos
        .filter(evento => evento.critico)
        .find(evento => evento.hora === "03:17");

O operador pergunta:

— Encontrou a causa?

Yuuya responde:

— Não. Só encontrei correlação.

O veterano do mainframe sorri.

Finalmente alguém aprendeu troubleshooting.

Porque:

CORRELAÇÃO != CAUSALIDADE

Nem mesmo uma arrow function possui Cheat Skill suficiente para mudar isso.


🧰 CAPÍTULO 24 — EXERCÍCIO PARA TREINAR SEU CÉREBRO COBOL

Pegue:

transacoes
    .filter(t => t.aprovada)
    .map(t => t.valor)
    .reduce((total, valor) => total + valor, 0);

Não traduza sintaxe.

Faça:

ENTRADA:
TRANSAÇÕES

FILTER:
QUEM FICA?

APROVADAS

MAP:
VIRA O QUÊ?

VALOR

REDUCE:
ACUMULA COMO?

SOMA

Conclusão:

some o valor de todas as transações aprovadas.

Agora imagine o equivalente COBOL:

MOVE ZERO TO WS-TOTAL

PERFORM VARYING IDX FROM 1 BY 1
    UNTIL IDX > WS-QTD-TRANSACOES

    IF TRANSACAO-APROVADA(IDX) = 'S'
        ADD TRANSACAO-VALOR(IDX)
            TO WS-TOTAL
    END-IF

END-PERFORM

São dois estilos descrevendo essencialmente a mesma intenção.


🏆 CAPÍTULO 25 — QUANDO ARROW FUNCTIONS REALMENTE BRILHAM

Elas são especialmente convenientes quando a função é:

  • pequena;

  • local;

  • usada uma única vez;

  • semanticamente evidente;

  • passada como callback;

  • utilizada em transformação de coleções.

Por exemplo:

precos.map(preco => preco * 1.10);

Perfeitamente razoável.

Mas quando a lógica cresce, nomes podem ser superiores.

Em vez de:

clientes.filter(c =>
    c.a &&
    c.b &&
    !c.x &&
    c.y > 500
);

prefira algo como:

clientes.filter(clienteElegivel);

O nome carrega significado.


🧙 CAPÍTULO 26 — A REGRA DE OURO DE YUUYA

Depois de atravessar a dungeon, Yuuya escreve na parede:

Não tente entender a seta. Entenda o fluxo dos dados.

Essa é a mudança fundamental.

Diante de:

dados
    .filter(...)
    .map(...)
    .reduce(...)

pergunte:

DE ONDE VÊM OS DADOS?

QUEM SOBREVIVE?

NO QUE SE TRANSFORMAM?

COMO SÃO AGREGADOS?

QUAL É A SAÍDA?

Essas perguntas funcionam quase independentemente da linguagem.


☕ EPÍLOGO — O COBOLZEIRO VOLTA DA DUNGEON

Yuuya atravessou a porta para outro mundo e descobriu habilidades que inicialmente pareciam mágicas.

O programador COBOL pode passar por experiência semelhante quando encontra programação funcional moderna.

No começo:

x => x * 2

parece uma linguagem inventada por alguém que cobrava por caractere.

Depois entendemos:

RECEBE X
DEVOLVE X * 2

Então encontramos:

filter

e aprendemos:

QUEM FICA?

Encontramos:

map

e perguntamos:

VIRA O QUÊ?

Encontramos:

reduce

e finalmente percebemos:

ACUMULA COMO?

A dungeon deixa de parecer tão assustadora.

Arrow functions não foram criadas porque funções tradicionais estavam erradas.

Elas surgiram porque determinadas situações envolvem pequenos comportamentos usados localmente, especialmente callbacks e transformações de coleções, e escrever toda a cerimônia de uma função nomeada repetidamente pode tornar o código desnecessariamente verboso.

Mas existe uma lição ainda mais importante.

Concisão não é sinônimo de legibilidade.

Isto:

x.filter(a=>a.b).map(c=>c.d).reduce((e,f)=>e+f,0)

pode impressionar alguém pela quantidade de lógica comprimida em uma linha.

Mas software corporativo não é campeonato de quem digita menos.

O programa que você escreve hoje poderá ser investigado durante um incidente às 03:17 daqui a quinze anos.

Talvez por alguém que ainda nem entrou na empresa.

Talvez por um jovem programador.

Talvez por uma IA.

Talvez por você mesmo, tentando lembrar:

"Quem foi o animal que escreveu isso?"

E então o Git responde:

AUTHOR: VOCÊ
DATE: 2026

Nesse momento você compreenderá definitivamente por que nomes importam.

COBOL possui algo valioso para ensinar às linguagens modernas: software também é comunicação entre seres humanos.

Programação funcional possui algo igualmente valioso para ensinar ao COBOLzeiro: nem sempre precisamos descrever cada passo mecânico de uma transformação quando podemos expressar diretamente sua intenção.

O verdadeiro Cheat Skill não é decorar:

=>

É aprender a reconhecer:

ENTRADA
   |
   V
SELEÇÃO
   |
   V
TRANSFORMAÇÃO
   |
   V
AGREGAÇÃO
   |
   V
SAÍDA

Quando você começa a enxergar isso, deixa de tentar executar cada instrução mentalmente.

Você passa a enxergar a arquitetura do algoritmo.

E então aquela linha:

pedidos
    .filter(pedido => pedido.pago)
    .map(pedido => pedido.valor)
    .reduce((total, valor) => total + valor, 0);

deixa de parecer uma magia de outro mundo.

Você olha para ela e pensa:

PEDIDOS
  ↓
PAGOS
  ↓
VALORES
  ↓
SOMA

Yuuya guarda a espada.

O COBOLzeiro termina o café.

E a misteriosa porta => permanece aberta.

Desta vez, porém, não existe mais monstro do outro lado.

Existe apenas outra maneira de escrever algoritmos.


☕ COPYBOOK FINAL DO BELLACOSA MAINFRAME

Se quiser guardar apenas uma página deste artigo, guarde esta:

=>      RECEBE → DEVOLVE

FILTER  QUEM FICA?

MAP     VIRA O QUÊ?

FIND    QUAL DELES?

SOME    EXISTE ALGUM?

EVERY   TODOS?

REDUCE  ACUMULA COMO?

SORT    COMPARA COMO?

E diante de qualquer pipeline funcional:

1. DESCUBRA A ENTRADA.

2. LEIA SOMENTE OS NOMES DAS OPERAÇÕES.

3. IDENTIFIQUE O FLUXO DOS DADOS.

4. ABRA UMA LAMBDA DE CADA VEZ.

5. TROQUE => POR "RECEBE E DEVOLVE".

6. DÊ NOMES HUMANOS ÀS VARIÁVEIS.

7. SE A LAMBDA FICOU GRANDE DEMAIS,
   EXTRAIA UMA FUNÇÃO COM NOME.

8. NÃO EXECUTE O PROGRAMA INTEIRO
   NA CABEÇA.

9. RECONHEÇA PADRÕES.

10. LEMBRE-SE:
    MENOS CARACTERES != MENOS COMPLEXIDADE.

No fim das contas, seja em COBOL, JavaScript, Java, Python ou no próximo isekai tecnológico, continuamos fazendo a mesma coisa:

recebendo dados, tomando decisões, transformando informações e produzindo resultados.

A sintaxe muda.

A dungeon muda.

Os monstros ganham nomes novos.

Mas o algoritmo continua lá.

E um programador que aprende a enxergá-lo por trás da sintaxe já desbloqueou seu verdadeiro Cheat Skill.

sexta-feira, 9 de junho de 2023

10 animes Slice of Life sobre criação, evolução e desafios

Bellacosa Mainframe e 10 animes slice of life

10 animes Slice of Life sobre criação, evolução e desafios

O anime Usagi Drop (também conhecido como Bunny Drop) é um elogiado slice of life que aborda a temática da paternidade/cuidado de uma criança em circunstâncias inesperadas, focando no crescimento emocional dos personagens e no cotidiano da nova família. A ressalva do "limite ético" geralmente se refere ao final do mangá, que diverge drasticamente do anime.

Considerando o foco do anime (relação pura de cuidado, calor humano, cotidiano, amadurecimento e "família não convencional"), aqui está uma lista de 10 animes com temáticas semelhantes, todos dentro do limite ético e do gênero slice of life / drama familiar:

#AnimeAno de LançamentoAutor (Mangaká Original)
1Amaama to Inazuma (Doçura & Relâmpago)2016Gido Amagakure
2Barakamon2014Satsuki Yoshino
3Kakushigoto2020Kōji Kumeta
4The Yakuza's Guide to Babysitting (Guia do Yakuza para Cuidar de Crianças)2022Tsukiya
5Aishiteruze Baby (Aishiteruze Baby ★★)2004Yōko Maki
6Udon no Kuni no Kiniro Kemari (Poco's Udon World)2016Shinomaru Nodoka
7Somali to Mori no Kamisama (Somali e o Espírito da Floresta)2020Yako Gureishi
8If It's for My Daughter, I'd Even Defeat a Demon Lord (Sewayaki Kitsune no Senko-san)2019CHIROLU (Light Novel)
9Deaimon: Recipe for Happiness2022Ren Mochizuki
10Chichin Puipui! (curta-metragem/ONA)2013Takashi Taniguchi

1. Amaama to Inazuma (Doçura & Relâmpago)

  • Sinopse: Kōhei Inuzuka, um professor viúvo, está lutando para cozinhar refeições nutritivas para sua filha pequena, Tsumugi. Ao se deparar com Kotori Iida, uma de suas alunas, que oferece um jantar em sua casa, ele descobre que cozinhar com outras pessoas e compartilhar as refeições pode ser uma atividade deliciosa e fortalecedora de laços. O anime foca na culinária como meio de união familiar.

  • Personagens Principais: Kōhei Inuzuka (Pai, professor), Tsumugi Inuzuka (Filha pequena), Kotori Iida (Colega de escola de Kōhei).

  • Dica: Perfeito para quem ama a combinação de comida e conforto (iyashikei). As reações de Tsumugi à comida são um show à parte.

  • Curiosidade: O mangaká, Gido Amagakure, costuma incluir receitas detalhadas no final de cada capítulo do mangá.


2. Barakamon

  • Sinopse: Handa Seishuu, um jovem e talentoso calígrafo, é enviado para uma ilha remota após agredir um crítico de arte. Esperando encontrar paz para se concentrar em sua arte, ele encontra a agitada e caótica Naru Kotoishi, uma garotinha local. O relacionamento inesperado e as interações com os moradores da ilha forçam Handa a crescer como pessoa e como artista.

  • Personagens Principais: Seishuu Handa (Calígrafo), Naru Kotoishi (Criança da ilha).

  • Dica: É um excelente anime de desenvolvimento de personagem, mostrando como a ingenuidade de uma criança pode ensinar lições valiosas a um adulto.

  • Curiosidade: O anime tem um spin-off chamado Handa-kun, que é uma comédia focada na vida de Handa no ensino médio, antes dos eventos de Barakamon.


3. Kakushigoto

  • Sinopse: Kakushi Gotō é um mangaká de sucesso que desenha mangás com conteúdo adulto e um tanto questionável. Ele faz de tudo para esconder sua profissão da sua filha, Hime, que ele cria sozinho, acreditando que ela seria julgada e envergonhada se descobrisse seu segredo. O anime transita entre o hilário cotidiano de esconder a verdade e flashforwards mais emocionais.

  • Personagens Principais: Kakushi Gotō (Pai, mangaká), Hime Gotō (Filha).

  • Dica: Ótimo para quem gosta de comédia com um forte toque de drama familiar, semelhante à forma como Usagi Drop mistura fofura e a seriedade da paternidade.

  • Curiosidade: O autor, Kōji Kumeta, é conhecido por seu estilo de comédia satírica e seu trabalho mais famoso é Sayonara Zetsubou Sensei.


4. The Yakuza's Guide to Babysitting (Guia do Yakuza para Cuidar de Crianças)

  • Sinopse: Toru Kirishima é um yakuza temido conhecido por sua violência. Cansado de lidar com sua natureza destrutiva, seu chefe lhe dá a tarefa mais difícil de sua vida: ser o babá de sua filha de sete anos, Yaeka Sakuragi. O anime segue a transformação gradual de Toru e o vínculo crescente entre a dupla.

  • Personagens Principais: Toru Kirishima (Yakuza, babá), Yaeka Sakuragi (Filha do chefe).

  • Dica: Assim como Usagi Drop, mostra um adulto "durão" ou sem experiência se tornando responsável por uma criança, forçando-o a mudar de vida.

  • Curiosidade: O contraste entre a aparência intimidante de Toru e seu jeito desajeitado, mas atencioso, com Yaeka é o motor da comédia e emoção.


5. Aishiteruze Baby (Aishiteruze Baby ★★)

  • Sinopse: Kippei Katakura, um estudante do ensino médio popular e despreocupado, tem sua vida virada de cabeça para baixo quando sua tia, após um colapso nervoso, abandona sua filha de 5 anos, Yuzuyu Sakashita. Kippei é forçado a assumir a responsabilidade de cuidar da prima, descobrindo o peso e a alegria da paternidade responsável.

  • Personagens Principais: Kippei Katakura (Estudante, primo/cuidador), Yuzuyu Sakashita (Prima de 5 anos).

  • Dica: É um shoujo clássico com uma abordagem muito honesta sobre a responsabilidade e o amadurecimento através do cuidado. Tem uma forte semelhança temática com Usagi Drop.

  • Curiosidade: O mangá aborda o desenvolvimento romântico de Kippei e como ele equilibra a vida escolar, social e a nova responsabilidade.


6. Udon no Kuni no Kiniro Kemari (Poco's Udon World)

  • Sinopse: Souta Tawara, um web designer de 30 anos que trabalha em Tóquio, volta à sua cidade natal na província de Kagawa após a morte de seu pai. Lá, ele encontra um garoto misterioso (Poco) em seu antigo restaurante de udon. O garoto acaba sendo um tanuki (espécie de guaxinim mágico japonês) que assume a forma humana. Souta decide cuidar de Poco, redescobrindo sua cidade e lidando com memórias do seu pai.

  • Personagens Principais: Souta Tawara (Web designer), Poco (Tanuki/Garoto).

  • Dica: Mistura o calor humano e a temática familiar de Usagi Drop com elementos de fantasia suave. Focado na paisagem rural e na culinária regional.

  • Curiosidade: A província de Kagawa é famosa no Japão pela produção de udon, e o anime faz um belo trabalho em mostrar a cultura e os pontos turísticos da região.


7. Somali to Mori no Kamisama (Somali e o Espírito da Floresta)

  • Sinopse: Em um mundo habitado por espíritos, goblins e outras criaturas, onde os humanos foram quase extintos, um Golem (ser guardião da floresta com pouco tempo de vida) encontra uma garotinha humana chamada Somali. O Golem assume o papel de pai e embarca em uma jornada com Somali para encontrar outros humanos, tudo isso enquanto seu tempo de vida se esgota.

  • Personagens Principais: Golem (Pai adotivo), Somali (Menina humana).

  • Dica: Embora seja um anime de fantasia, o cerne da história é a relação paternal e a proteção incondicional, muito parecida com a de Usagi Drop e com uma grande carga emocional.

  • Curiosidade: A animação é notável pela sua direção de arte e a beleza dos cenários de fantasia, transportando o espectador para um mundo visualmente rico e melancólico.


8. If It's for My Daughter, I'd Even Defeat a Demon Lord

  • Sinopse: Dale, um aventureiro talentoso e reservado, encontra Latina, uma jovem garota demônio, abandonada em uma floresta. Sem conseguir deixá-la sozinha, ele a adota e se torna seu pai. A vida de aventureiro de Dale é substituída pelas alegrias e desafios da paternidade, enquanto ele faz tudo para proteger Latina.

  • Personagens Principais: Dale (Aventureiro/Pai), Latina (Garota demônio/Filha).

  • Dica: É uma série de fantasia que, na verdade, é um slice of life disfarçado. O foco está quase inteiramente nas interações adoráveis de Latina e no instinto superprotetor e carinhoso de Dale.

  • Curiosidade: Assim como em Usagi Drop, a história original (light novel/mangá) também possui uma progressão que pode ser polêmica para alguns leitores, mas o anime de TV se concentra apenas na fase de paternidade/infância, mantendo o tom "fofo e ético".


9. Deaimon: Recipe for Happiness

  • Sinopse: Nagomu Irino, de 30 anos, retorna à sua casa em Kyoto para assumir a tradicional loja de doces japoneses (wagashi) da família, depois que seu pai é hospitalizado. No entanto, ele descobre que a herdeira "escolhida" é Itsuka Yukihira, uma garota de 10 anos que foi acolhida pela família Irino. Nagomu e Itsuka aprendem a conviver, e ele assume um papel de mentor e figura familiar para a garota.

  • Personagens Principais: Nagomu Irino (Filho que retorna), Itsuka Yukihira (Garota de 10 anos).

  • Dica: Um anime calmante (iyashikei) que usa a culinária tradicional e a atmosfera de Kyoto para explorar as dinâmicas familiares, a responsabilidade e o conceito de lar.

  • Curiosidade: O anime dedica bastante tempo a detalhes sobre a criação dos doces wagashi e sua conexão com as estações do ano, sendo também uma celebração da cultura local.


10. Chichin Puipui! (Curta-metragem/ONA)

  • Sinopse: Um adorável curta-metragem/Original Net Animation que se passa em uma época mais antiga, acompanhando o dia a dia de um homem mais velho que cuida de sua neta pequena em uma casa rural. A história é simples, focada nos pequenos momentos de ternura, nas brincadeiras e no calor do lar, sem diálogo, apenas com música e sons ambientes.

  • Personagens Principais: Avô, Neta.

  • Dica: Se você gostou da atmosfera tranquila e da pura inocência infantil do anime Usagi Drop, este curta é uma dose concentrada desse sentimento.

  • Curiosidade: O estilo de animação e o design de som criam uma atmosfera de conto de fadas, sendo um exemplo perfeito de como os animes podem evocar emoções fortes com uma simplicidade sublime.

quinta-feira, 8 de junho de 2023

Spy vs. Spy no z/OS: Red Team vs. Blue Team e o ABEND que Quase Comeu o Banco


 

Um Café no Bellacosa Mainframe

Spy vs. Spy no z/OS: Red Team vs. Blue Team e o ABEND que Quase Comeu o Banco

💣 Dois espiões. Um Sysplex. Um RACF. Quatro milhões de logs. Nenhuma confiança. E um operador que só queria tomar café.

Existe uma antiga regra da computação corporativa que provavelmente deveria estar escrita na entrada de todo datacenter:

Se existe uma maneira absurdamente improvável de alguma coisa dar errado, alguém eventualmente colocará aquilo em produção.

No mundo do mainframe, entretanto, existe uma segunda regra.

Se alguém colocar aquilo em produção, provavelmente haverá um SYSOUT explicando exatamente o que aconteceu.

O problema será encontrar o maldito SYSOUT.

E foi exatamente nesse ponto que começou a guerra.

De um lado estava o Red Team.

Casaco vermelho imaginário, sorriso suspeito, criatividade questionável e uma convicção quase religiosa de que qualquer sistema pode ser quebrado se você fizer perguntas suficientemente inconvenientes.

Do outro estava o Blue Team.

Casaco azul igualmente imaginário, três consoles SDSF abertos, acesso ao SIEM, uma quantidade industrial de café e a certeza de que existe um log para tudo.

Mesmo que esteja num dataset criado em 1997.

Em uma fita.

Guardada por alguém chamado Geraldo.

Que se aposentou em 2011.

Era, portanto, inevitável.

Spy vs. Spy havia chegado ao IBM Z.



🕵️ 1. Os dois espiões entram no Sysplex

Imagine um ambiente corporativo clássico:

                    INTERNET
                       |
                   FIREWALL
                       |
                      DMZ
                       |
          +------------+------------+
          |                         |
    z/OS Connect                    MQ
          |                         |
          +------------+------------+
                       |
                IBM Z / z/OS
                       |
        +--------------+--------------+
        |              |              |
       CICS           IMS            APIs
        |              |              |
        +--------------+--------------+
                       |
                      Db2
                       |
              DADOS DA EMPRESA


Para um arquiteto, isto é um diagrama.

Para o Blue Team, é superfície a defender.

Para o Red Team, é um cardápio.

O espião vermelho olha para aquilo e pensa:

"Por onde eu entraria?"

O azul olha para a mesma arquitetura e pensa:

"Por onde ele tentaria entrar?"

Parece a mesma pergunta.

Não é.

Essa pequena diferença contém praticamente toda a filosofia de Red Team e Blue Team.


🔴 2. O Spy Vermelho aparece

Nosso Red Spy recebe sua missão.

O alvo não é:

"Hackear o mainframe."

Isso seria uma descrição digna de filme ruim de Hollywood.

A missão real parece mais com:

Avaliar se um atacante que comprometa determinadas credenciais corporativas poderia alcançar funções sensíveis executadas no ambiente z/OS.

Agora temos algo interessante.

Existe escopo.

Existem Rules of Engagement.

Existem sistemas autorizados.

Existem horários.

Existem técnicas proibidas.

Porque Red Team profissional não significa sair detonando coisas.

Significa reproduzir comportamento adversarial de maneira controlada.

O objetivo não é destruir o castelo.

É descobrir se alguém conseguiria entrar nele.

E, idealmente, fazer isso sem derrubar a ponte levadiça, incendiar o fosso e desligar o CICS às 14h37 de uma sexta-feira.


🔵 3. O Spy Azul já está desconfiado

O Blue Team recebe outra missão:

Detectar, investigar, conter e compreender atividades potencialmente hostis dentro do ambiente.

Ele abre suas armas.

Não são pistolas.

São coisas muito mais perigosas.

SMF
RACF
SDSF
SIEM
Syslog
NetView
OMEGAMON
zSecure
AT-TLS logs
CICS logs
MQ logs
Db2 traces
USS logs
network telemetry

O Red Spy olha aquilo e pensa:

"Preciso não aparecer."

O Blue Spy pensa:

"Ele já apareceu. Só preciso descobrir onde."

Primeiro quadro da história.

O espião vermelho coloca uma bomba.

O azul encontra a bomba.

O vermelho percebe que o azul encontrou.

O azul percebe que o vermelho percebeu que ele encontrou.

E alguém no meio disso abre um Sev1.



🧭 4. ROUND ONE — Reconnaissance

Nenhum atacante competente começa digitando:

TSO HACK

Embora isso facilitasse bastante o trabalho do Blue Team.

O ataque começa com reconhecimento.

O Red Team tenta compreender o ambiente.

Tecnologias.

Interfaces.

Domínios.

Aplicações.

Padrões de nomes.

APIs.

Funcionários.

Documentação pública.

Mensagens de erro.

Endpoints.

Talvez encontre referências como:

CICS
IMS
Db2
MQ
z/OS Connect
RACF
TSO
ISPF

Para alguém sem experiência, isso é sopa de letrinhas.

Para quem conhece mainframe, cada sigla conta uma história.

Se existe MQ, existem canais.

Se existe CICS, existem transações.

Se existe z/OS Connect, provavelmente existem APIs chegando ao ambiente tradicional.

Se existe USS, existe um mundo POSIX vivendo dentro do z/OS.

E se existe RACF...

O Red Spy sorri.

O Blue Spy também.

Por razões completamente diferentes.


🔵 Blue Team contra-ataca

O Blue Team pergunta:

Que atividade externa antecedeu isso?

Houve enumeração?

Houve múltiplas requisições incomuns?

Apareceram erros repetidos?

Existem padrões nos logs?

O SIEM começa a enxergar peças.

IP → endpoint
endpoint → aplicação
aplicação → identidade
identidade → recurso

A diferença entre log e telemetria útil começa exatamente aqui.

Log sozinho é evidência.

Correlação transforma evidência em história.



💣 5. ROUND TWO — Credential Attack

O Red Spy encontra uma identidade válida.

Não importa para nossa história exatamente como.

Talvez phishing autorizado.

Talvez uma credencial de laboratório.

Talvez um cenário previamente preparado.

O importante é que agora temos:

USERA

E USERA funciona.

O Red Team comemora durante aproximadamente quatro segundos.

Porque uma credencial válida não significa acesso ilimitado.

É aqui que RACF entra no palco carregando uma enorme placa escrita:

ICH408I

Poucas mensagens conseguem destruir a autoestima de um atacante com tanta eficiência.

O Red Spy tenta um recurso.

ACCESS INTENT(READ)

Negado.

Outro.

Negado.

Outro.

Negado.

O Blue Spy começa a observar várias negativas associadas ao mesmo usuário.

Sua sobrancelha azul metafórica sobe.

Um usuário normal pode receber uma negativa.

Duas talvez.

Dezessete acessos negados em recursos completamente diferentes?

Hmm.



🪜 6. ROUND THREE — Privilege Escalation

O Red Team agora quer descobrir uma coisa muito mais interessante:

USERA consegue tornar-se algo maior do que deveria?

Este é um dos pontos centrais de qualquer avaliação séria.

Porque muitas invasões importantes não acontecem devido a uma única vulnerabilidade espetacular.

Elas acontecem por encadeamento.

Um pequeno acesso permite outro.

O segundo permite um terceiro.

O terceiro revela uma configuração.

A configuração abre outra possibilidade.

De repente:

baixo privilégio
      ↓
configuração esquecida
      ↓
permissão excessiva
      ↓
credencial técnica
      ↓
recurso sensível

Nenhuma peça isolada parecia catastrófica.

Juntas formaram uma escada.

O Spy Vermelho sobe.

O Spy Azul começa a juntar eventos.


🔵 7. O Blue Team descobre a diferença entre EVENTO e INCIDENTE

Imagine o seguinte:

Às 13:41:

USERA acessa recurso X

13:43:

USERA acessa recurso Y

13:45:

USERA executa função Z

Separadamente, talvez ninguém ligasse.

Mas o Blue Team possui contexto.

USERA pertence à contabilidade.

Contabilidade não executa Z.

Contabilidade nunca acessou Y.

E Z aconteceu dois minutos depois de Y.

Agora não temos três eventos.

Temos uma narrativa.

O analista azul coloca seus óculos imaginários de Sherlock Holmes.

Ou talvez de Capitão Haddock depois de descobrir que alguém mexeu em seu whisky.



🚶 8. ROUND FOUR — Lateral Movement

O Spy Vermelho conseguiu entrar em algum lugar.

Mas atacantes raramente querem permanecer onde chegaram.

Eles querem descobrir:

"Onde mais essa identidade funciona?"

Surge então o movimento lateral.

Em ambientes distribuídos isso significa frequentemente servidor → servidor.

No ecossistema mainframe a história pode assumir formas muito diferentes.

API
 ↓
z/OS Connect
 ↓
CICS
 ↓
programa
 ↓
Db2

Ou:

aplicação
 ↓
MQ
 ↓
queue
 ↓
consumer
 ↓
transação

Ou:

USS
 ↓
processo
 ↓
dataset
 ↓
job

E aqui aparece uma lição importante.

O mainframe moderno não é uma máquina isolada em uma caverna.

Ele é parte de um ecossistema.

APIs.

Cloud.

Containers.

Aplicações móveis.

Middleware.

Mensageria.

Linux.

Internet.

Parceiros.

Portanto, defender IBM Z significa entender os caminhos que chegam ao IBM Z.



👻 9. ROUND FIVE — Persistence

O Red Spy agora pensa como qualquer vilão de desenho animado competente:

"E se me expulsarem?"

Entrar uma vez é bom.

Conseguir voltar é melhor.

O Red Team testa se existem mecanismos capazes de produzir persistência.

Não necessariamente implantando alguma coisa destrutiva.

O objetivo pode simplesmente ser determinar se controles existentes permitiriam que determinado tipo de persistência fosse possível.

O Blue Team está procurando justamente aquilo.

Novos objetos.

Alterações incomuns.

Mudanças de privilégios.

Execuções fora de padrão.

Jobs inesperados.

Mudanças em datasets sensíveis.

Relacionamentos RACF novos.

Comportamento diferente do baseline.

E então acontece a tradicional cena Spy vs. Spy.

O vermelho abre uma porta.

Atrás dela está o azul.

O azul abre outra.

Atrás dela está o vermelho.

Os dois apontam um para o outro.

Atrás dos dois existe um auditor com uma planilha Excel.



🥸 10. ROUND SIX — Evasion

Agora começa uma das partes mais divertidas de qualquer Red Team.

O vermelho sabe que existem sensores.

Então começa a pensar:

"Como minhas ações aparecem para quem está olhando?"

Isso muda completamente o jogo.

O Red Team deixa de avaliar apenas:

"Consigo fazer?"

E começa a testar:

"Consigo fazer sem ser percebido?"

Esse ponto distingue avaliações superficiais de exercícios maduros.

Porque um controle pode impedir uma ação.

Excelente.

Mas talvez não detecte tentativas.

Outro controle pode não impedir completamente algo, porém gerar um alerta instantâneo.

Também excelente.

Segurança não é uma muralha única.

É uma combinação de:

PREVENT
DETECT
RESPOND
RECOVER

O Spy Vermelho procura os espaços entre essas camadas.

O Azul procura exatamente os mesmos espaços.


📟 11. Blue Team abre o SDSF

Enquanto isso, em algum lugar do datacenter...

Um operador olha para:

DA
ST
H
LOG

E pergunta:

"Por que diabos existem tantos jobs desse usuário?"

O silêncio toma conta da sala.

O Red Spy sente uma perturbação na Força.

O Blue Spy sorri.

Porque uma característica fascinante do mainframe é que muitas atividades acabam produzindo rastros extremamente ricos.

SMF é praticamente a caixa-preta do ecossistema z/OS.

É possível registrar uma quantidade impressionante de informações sobre:

  • execução;

  • autenticação;

  • datasets;

  • jobs;

  • subsistemas;

  • rede;

  • segurança;

  • utilização;

  • desempenho.

O problema moderno raramente é:

"Não temos logs."

O problema frequentemente é:

"Temos tantos logs que ninguém percebeu que a invasão estava gritando há três horas."



💥 12. ROUND SEVEN — O ataque chega perto do prêmio

Finalmente o Red Team encontra um caminho plausível até o objetivo estabelecido no exercício.

Talvez seja acesso a determinado dado.

Talvez execução de determinada função.

Talvez uma transação crítica.

Talvez o comprometimento de uma identidade privilegiada simulada.

O Red Spy chega diante da porta.

Na porta está escrito:

PROD.PAYMENT.CRITICAL

Ele toca a maçaneta.

E então...

ALERTA.

O Blue Team detectou.

Ou não.

É justamente por isso que o exercício existe.

Se detectou, queremos saber:

Quanto tempo demorou?

Qual telemetria disparou?

O alerta tinha contexto suficiente?

O analista entendeu?

Escalou corretamente?

Conseguiu correlacionar?

A contenção funcionou?

E se NÃO detectou...

Parabéns.

Acabamos de encontrar algo extremamente valioso.

Não um motivo para demitir alguém.

Uma oportunidade para melhorar o sistema antes que o Spy Vermelho seja substituído por um atacante real.


🟣 13. Entra o personagem secreto: Purple Team

E então ocorre a maior heresia de toda a guerra.

O Red Spy e o Blue Spy param de tentar explodir um ao outro.

Sentam na mesma mesa.

Surge o Purple Team.

Ele pergunta ao Red:

O que você fez?

Depois pergunta ao Blue:

O que você viu?

Red:

Executei A.

Blue:

Não vimos.

Purple:

Excelente. Vamos descobrir por quê.

Red:

Depois fiz B.

Blue:

Isso gerou alerta.

Purple:

Quanto tempo?

Blue:

Quatro minutos.

Red:

Interessante.

Purple:

Podemos reduzir?

De repente Spy vs. Spy vira laboratório.

É aqui que exercícios maduros começam realmente a gerar valor.


🧠 14. O verdadeiro objetivo do Red Team

Existe um erro clássico:

"O Red Team venceu porque conseguiu entrar."

Não.

Outro erro:

"O Blue Team venceu porque bloqueou tudo."

Também não.

O exercício não é futebol.

Não existe placar:

RED TEAM   3
BLUE TEAM  2

Se o Red Team encontra uma falha séria antes de um atacante real:

a organização venceu.

Se o Blue Team detecta uma técnica que nunca havia testado:

a organização venceu.

Se ambos descobrem que determinada telemetria não está sendo coletada:

a organização venceu.

A pior situação é aquela em que ninguém testa nada e todos acreditam que tudo funciona.


🛡️ 15. Mainframe não é invulnerável

Existe outra lenda corporativa particularmente perigosa:

"Mainframe é impossível de hackear."

Não.

IBM Z possui uma arquitetura de segurança extremamente madura.

Mas segurança nunca depende apenas da plataforma.

Existe configuração.

Existem pessoas.

Existem aplicações.

Existem credenciais.

Existem integrações.

Existem APIs.

Existem permissões históricas.

Existem processos.

E existe o componente mais imprevisível já implantado em qualquer infraestrutura:

HUMAN.USER

Esse componente não possui PTF.


🧩 16. A diferença brutal do ambiente legado

Agora chegamos ao detalhe que torna Red Team em mainframe particularmente interessante.

Você encontra coisas que existem há décadas.

Datasets criados em eras geológicas diferentes.

Naming conventions fossilizadas.

Aplicações COBOL escritas quando Michael Jackson ainda lançava discos.

REXX que ninguém sabe quem escreveu.

CLIST aparentemente mantido por magia negra.

JCL copiado desde a administração Reagan.

Perfis RACF herdados de reorganizações corporativas que ninguém mais lembra.

Jobs chamados:

TEMP01
TEMP02
TEMP03
TEMP03B
TEMP03B_NEW
TEMP03B_NEW2
TEMP03B_NEW2_OK

E todos estão em produção.

Desde 2004.

Não mexa.

Ninguém sabe o que acontece.


☢️ 17. O Spy Vermelho encontra TEMP03B_NEW2_OK

O Red Spy observa o nome.

O Blue Spy observa o Red Spy observando o nome.

Ambos sabem.

Existe alguma coisa ali.

Talvez nada.

Talvez o sistema financeiro inteiro dependa disso.

Ninguém ousa executar:

DELETE

Existe uma velha superstição mainframeira:

Quanto mais ridículo o nome de um dataset, maior a probabilidade de ele ser crítico para o negócio.

Isso nunca foi cientificamente comprovado.

Mas nenhum veterano pretende testar.


🔎 18. IOC não basta — comportamento importa

Outra lição do confronto:

Não basta procurar endereços IP ruins.

Não basta procurar hashes.

Não basta procurar assinaturas conhecidas.

Um atacante usando uma identidade válida pode parecer perfeitamente legítimo.

A detecção moderna precisa considerar comportamento.

Imagine:

USERA

normalmente:

08:00 login
08:10 aplicação financeira
12:00 almoço
17:30 logout

Subitamente:

02:37 login
02:38 enumeração
02:42 dezenas de recursos
02:49 execução incomum
02:52 novo acesso privilegiado

Talvez USERA tenha desenvolvido uma súbita paixão por administração de sistemas às três da manhã.

Ou talvez tenhamos um problema.


🚨 19. O momento da contenção

O Blue Team decide agir.

Conta suspensa.

Sessão encerrada.

Credencial revogada.

Acesso bloqueado.

Sistema isolado conforme o cenário.

O Spy Vermelho vê a porta fechar.

Sorri.

Porque aquela era exatamente a pergunta do exercício:

O Blue Team conseguiria perceber e interromper o ataque antes do objetivo final?

Resposta:

Sim.

Ou talvez:

Quase.

Ou:

Não.

Todas são respostas úteis.

Desde que sejam transformadas em ação.


📜 20. Depois da explosão vem o relatório

Agora aparece o verdadeiro chefe final de qualquer operação.

Não é RACF.

Não é SIEM.

Não é CICS.

Não é Db2.

É o:

RELATÓRIO TÉCNICO

O Red Spy olha assustado.

O Blue Spy começa a suar.

O Purple Team abre o Word.

Todos percebem que talvez fosse mais fácil enfrentar hackers.

O documento terá:

  1. Executive Summary

  2. Scope

  3. Rules of Engagement

  4. Architecture

  5. Methodology

  6. Timeline

  7. Attack Paths

  8. Findings

  9. Detection Results

  10. Response Results

  11. Evidence

  12. Risk Classification

  13. Recommendations

  14. Remediation Plan

  15. Retest Plan

E principalmente:

evidência.

Nada de:

"Achamos que talvez pudesse acontecer."

Queremos:

timestamp
user
resource
event
system
evidence
impact
control

Porque segurança sem evidência vira opinião.


🧪 21. O Retest

Meses depois os dois espiões voltam.

O Red Team tenta novamente.

A antiga porta não existe mais.

O Blue Team criou novas regras.

Novos alertas.

Melhor correlação.

Permissões foram corrigidas.

A telemetria foi ampliada.

O Red Spy tenta A.

Bloqueado.

Tenta B.

Detectado.

Tenta C.

O SOC recebe alerta.

Tenta D.

Um analista liga:

"Olá. Nós sabemos o que você está fazendo."

Silêncio.

O Red Spy fecha o terminal.

O Blue Spy toma café.


🏆 22. Quem ganhou?

Resposta:

os dois.

Mais precisamente:

ganhou a organização.

Porque o objetivo de segurança não é construir a ilusão de que ataques nunca acontecerão.

O objetivo é tornar o ambiente:

difícil de comprometer
        +
difícil de explorar
        +
difícil de permanecer
        +
fácil de observar
        +
rápido de responder
        +
capaz de recuperar

Esse é o jogo.


🧓 23. E o mainframe?

No canto do datacenter está um IBM Z.

Ele acompanhou toda a confusão.

Red Team.

Blue Team.

Purple Team.

SOC.

SIEM.

Threat Intelligence.

MITRE ATT&CK.

Zero Trust.

APIs.

Cloud.

IA.

O mainframe olha para todos.

Ele já viu modas passarem.

Client-server.

SOA.

Web 2.0.

Cloud.

Microservices.

DevOps.

AI.

Alguém pergunta:

"Você está bem?"

O z/OS responde:

IEF404I JOB ENDED
MAXCC=0000

E continua processando quatro bilhões de transações como se nada tivesse acontecido.


☕ Epílogo — Spy vs. Spy, edição Mainframe

Na última cena, o Spy Vermelho deixa uma caixa sobre a mesa do Blue Team.

O Blue abre cuidadosamente.

Dentro existe apenas um bilhete:

"Você esqueceu uma regra."

O Blue imediatamente verifica RACF.

Nada.

SIEM.

Nada.

CICS.

Nada.

MQ.

Nada.

Firewall.

Nada.

Ele vira o bilhete.

No verso:

"A máquina pode ser extraordinariamente segura.
O ambiente só será tão seguro quanto aquilo que vocês lembraram de configurar, monitorar e testar."

O Blue Spy sorri.

Coloca outro bilhete dentro da caixa.

Entrega de volta ao Red.

O vermelho abre.

Está escrito:

"Nós vimos você deixar esta caixa."

Silêncio.

Os dois se encaram.

Em algum lugar do Sysplex aparece:

ICH408I
USER(REDSPY )
ACCESS DENIED

O Spy Azul começa a rir.

O vermelho puxa uma enorme bomba preta de desenho animado de dentro do casaco.

No pavio está escrito:

//EXPLODE JOB ...

Antes que possa acendê-la, JES2 responde:

JCL ERROR

O vermelho olha incrédulo.

O azul cai da cadeira.

E assim termina mais um dia no datacenter.

Porque depois de sessenta anos de evolução tecnológica existe uma verdade que continua absolutamente universal:

você pode enfrentar Red Team, Blue Team, ransomware, engenharia social, ataques sofisticados e agentes de ameaça financiados por Estados.

Mas cedo ou tarde...

todo mundo perde uma batalha para um erro de JCL.

Bellacosa Mainframe

Onde Red Team tenta entrar, Blue Team tenta descobrir, Purple Team tenta fazer os dois conversarem — e o velho z/OS registra tudo em algum SMF que ninguém lembrou de colocar no dashboard.



Para ir mais longe

https://eljefemidnightlunch.blogspot.com/2026/08/dick-vigarista-ia-e-o-concurso-pay-to.html


quarta-feira, 7 de junho de 2023

Sobre prostituição em Terras nIponicas

Bellacosa Mainframe e a prostituição no japão    

Sobre prostituição em Terras nIponicas

Um tema sensível, que causa muita polêmica, tentarei ser o mais correto em abordar um tema, que por si só causa discussões acaloradas. 

⚖️ A lei japonesa

A Lei Antiprostituição de 1956 (Baishun Bōshi Hō) define prostituição como “relação sexual vaginal em troca de dinheiro”.
Ou seja, apenas o ato sexual completo é proibido — e até assim, a punição costuma recair sobre quem lucra intermediando, não sobre as pessoas que se prostituem.


💋 O que é permitido (e existe legalmente)

Graças à definição restrita da lei, surgiu toda uma indústria do chamado “fūzoku” (風俗) — termo que cobre uma ampla gama de serviços sexuais legais, como:

  • Soaplands 🫧 – banhos eróticos com massagens e contatos íntimos (mas “oficialmente” sem penetração).

  • Fashion Health – clínicas de “massagem sensual” ou “serviços de fantasia”.

  • Pink salons – locais que oferecem sexo oral (legal, pois não é considerado “intercurso”).

  • Delivery health (デリヘル) – acompanhantes que vão até hotéis ou residências.

  • Hostess clubs / Host clubs – bares onde se paga pela companhia e flerte (sem sexo explícito).

Esses estabelecimentos são registrados e fiscalizados pelo governo local sob a Lei de Negócios de Entretenimento e Moralidade (Fūeihō).


🚫 O que é ilegal

  • Relações sexuais completas pagas, mesmo consensuais, continuam tecnicamente ilegais.

  • Tráfico humano, prostituição forçada, exploração de menores e coerção são crimes graves.

  • Também há proibições rígidas contra menores de 18 anos em qualquer tipo de fūzoku.


🏙️ Na prática

Na realidade, há tolerância social e institucional, especialmente em distritos conhecidos como:

  • Kabukichō (Shinjuku, Tóquio)

  • Susukino (Sapporo)

  • Nakasu (Fukuoka)

  • Tobita Shinchi (Osaka) – um dos poucos “bairros de prostituição” ainda ativos, onde as casas operam discretamente.

A polícia tende a agir apenas quando há denúncias, escândalos ou envolvimento de menores ou estrangeiros sem visto apropriado.


🧠 Curiosidade cultural

O Japão tem uma longa história de prostituição institucionalizada, desde o período Edo com as “yūjo” (cortesãs profissionais) até as geishas, que eram artistas mas conviviam nesse mesmo universo de entretenimento.
O termo moderno “fūzoku” acabou herdando essa ambiguidade entre prazer, serviço e espetáculo.

------------

Com um olhar ocidental brasilerio e espionando, o mundo do fūzoku japonês (風俗産業) é vasto, curioso e cheio de sutilezas culturais.

Vamos destrinchar essa indústria semi-legal do prazer, que movimenta bilhões de ienes por ano e revela muito sobre a sociedade japonesa contemporânea.
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...