Transformação/Coerção de valores com base em Schemas - Clojure

Compartilhando um pouco do que sei sobre como se dá o processo de coerção de uma estrutura de dados usando um schema como base.

1. Conceitos Fundamentais

1.1 Schemas

É uma notação utilizada pra descrever o formato de uma estrutura de dados. Quando trabalhamos com o Clojure, é muito difundido no mercado a biblioteca Plumatic/Prismatic Schema, ela fornece uma série de helpers para facilitar a composição dos formatos de dados, o que chamamos de schemas, e também provê meios para que possamos aplicar validações dos valores contra os formatos esperados, seja na validação da estrutura de dados de entrada e saída de uma função, até mesmo o body de requisição ou de resposta de um determinado endpoint HTTP.

Exemplo do schema de um mapa (estrutura de dados) que representa uma pessoa, no exemplo definimos quais as chaves e os tipos esperados para os valores:

(require '[schema.core])

(def ColorEnum (schema.core/enum :red :green :blue))

(schema.core/defschema Person
                       {:name           schema.core/String
                        :favorite-color ColorEnum})

No schema acima definimos que esperamos uma chave :name onde o valor é do tipo String, e uma chave :favorite-color onde o valor esperado é um enum de keywords com três opções de possíveis valores.

Você pode recorrer a documentação da biblioteca para encontrar exemplos de como compor schemas e de como validar os mesmos com a descrição dos cenários de sucesso e falhas na validação.

2. Transformação/Coerção de valores com base em um determinado schema

A documentação da Plumatic/Prismatic Schema que é a lib que utilizamos como base para o mecanismos de validação e transformação comumente usada em aplicações desenvolvidas em Clojure, descreve o processo de Coercion como sendo o mesmo que uma validação de um schema, mas adicionando um passo anterior a validação, a transformação aplicada no mapa de entrada usando um schema base para a transformação, após a coerção dos valores é aplicada a validação do dado retornado pela transformação com base no schema indicado.

  1. Transformação do dado de entrada usando como fôrma um determinado schema.
  2. Validação da saída da transformação com base no schema especificado.

Vamos ver na prática, como podemos fazer a transformação de um dado com base em um schema. Para o nosso exemplo ilustrativo vamos criar um FOO BAR coercer:

  1. Esperamos de entrada um mapa que contenha uma chave qualquer que aponte para um valor "FOO". As chaves e valores devem ser do tipo String.
  2. Na etapa de transformação esperamos que as chaves do tipo String sejam convertidas para Keyword. E para os valores do mapa esperamos que todas as Strings "FOO" sejam substituídas por "FOO BAR".
  3. No schema de saída esperamos um mapa com uma única Keyword como chave e que ela possua como valor a String "FOO BAR".

Começamos com a definição dos exemplos que vamos usar de input para o processo de transformação e validação (coercion):

(def valid-foor-bar-json-input {"test" "FOO"})
(def invalid-foor-bar-json-input {"test-i" "Blue Pen"})

Configuração do mecanismo de coerção/transformação: Os Matchers para o processo de transformação/coerção, são nada mais nada menos que mapas onde indicamos como cada tipo de dado deve ser adaptado a partir de um tipo X para um tipo Y.

(require '[schema.core])
(require '[schema.coerce])

(def FooBar (schema.core/eq "FOO BAR"))

(def foo-bar-coercions
  {FooBar              (fn [input] (if (= input "FOO") "FOO BAR" input))
   schema.core/Keyword (fn [input] (if (string? input) (keyword input) input))})

(defn foo-bar-matcher
      [schema]
      (foo-bar-coercions schema))

(schema.core/defschema FooBarResult
                       {schema.core/Keyword FooBar})

(def foo-bar-coercer
  (schema.coerce/coercer FooBarResult foo-bar-matcher))

Transformação/Coerção de fato:

(foo-bar-coercer valid-foor-bar-json-input)
=> {:test "FOO BAR"}

(foo-bar-coercer invalid-foor-bar-json-input)
=> #schema.utils.ErrorContainer{:error {"test-i" (not (= "FOO BAR" "Blue Pen"))}}

Quando executamos a chamada (foo-bar-coercer valid-foor-bar-json-input) temos o retorno esperado, onde o valor "FOO" foi transformado em "FOO BAR" e o resultado atende ao schema especificado.

No segundo exemplo de chamada (foo-bar-coercer invalid-foor-bar-json-input) o dado de entrada passou pelo step de transformação, mas a saída não atendeu o schema esperado gerando um erro.

Como isso é utilizado de forma mais prática e útil?

Published: 2025-11-13

Tagged: Schema Data Validation Clojure Coercion

Como identifico o momento correto para compra de Bitcoin?

Isenção de responsabilidade

Não possuo nenhuma credencial de analista de investimento. O conteúdo dessa página não se trata de uma sugestão de investimento. Não me responsabilizo pelas consequências de colocar o conteúdo a seguir em prática.

Não sou a pessoa mais entusiasta sobre o mercado de criptomoedas. Reconheço o histórico e o potencial de valorização, mas não guardaria todos os meus ovos nessa única cesta.

A minha abordagem para investir nesse mercado é fazer com que o valor investido não ultrapasse 5% do total geral (soma das minhas posições em todos os outros mercados e classes de ativos).

Independente do tipo de mercado, no momento de decidir no que investir, sigo uma máxima: Comprar o que os outros estão vendendo barato por conta do medo irracional sobre suposições a respeito do futuro.

Estudando o histórico do mercado de criptomoedas, observamos ciclos de valorização e desvalorização. Com uma certa frequência surgem notícias anunciando a morte do Bitcoin, o que leva muitas pessoas a venderem os seus ativos, e isso resulta numa redução temporária no preço do ativo. É nesse momento que aproveito para colocar no bolso uma maior quantidade de moedas por um preço mais baixo, esperando que mais cedo ou mais tarde o valor do ativo volte a subir.

Fear and Greed Index (Índice de Medo e Ganância)

Crypto Fear end Greed Index Dashboard
Figura 1 — Crypto Fear end Greed Index Dashboard

O Fear end Greed Index pode ser utilizado para identificar com maior clareza em que ponto do ciclo estamos. Se o mercado está muito otimista, há uma supervalorização do ativo. Por outro lado, se o mercado está receoso, há uma subvalorização.

O Índice de Medo e Ganância das Criptomoedas acompanha o sentimento dos investidores nos mercados de criptomoedas, indicando se o medo ou a ganância estão influenciando as decisões de negociação. Ele analisa fatores como volatilidade e momento do mercado.

- Crypto Fear end Greed Index

O índice trata-se de uma medida numérica que varia de 0 até 100 com a seguinte categorização qualitativa descritiva:

A medida que a pontuação se apróxima das extremidades, maior é o indício de que a maioria dos investidores está negociando de forma impulsiva e emocional. Com base no valor atual do índice aplico o seguinte processo de tomada de decisão:

O mesmo racional também é aplicável na bolsa de valores, mas decisões não devem ser tomadas apenas com base no índice, é necessário analisar a saúde financeira e o desempenho das empresas negociadas.

Published: 2025-10-20

Tagged: Investimento

Importância do Monitoramento do Nível de Concentração de Dióxido de Carbono (CO2) em Ambientes Fechados - Home Office Edition

O principal desafio enquanto trabalhando de home office é lidar com o barulho externo da cidade, carros buzinando, motores ligados enquanto esperam o semáforo abrir, sistemas de som anunciando as promoções do dia em um supermercado próximo. Para contornar essa dificuldade, trabalho com duas barreiras de contenção para o barulho, a primeira barreira é um bom fone de ouvido com um excelente sistema de cancelamento de ruído ativo, a segunda barreira é a janela e porta do escritório completamente fechadas.

Um dos principais produtos do processo de respiração do ser humano é o CO2. Um ambiente fechado (mal ventilado) com pessoas respirando dentro, não consegue proporcionar uma boa taxa de renovação do ar o que tem como resultado o crescimento paulatino do nível de concentração de CO2 no ambiente a medida que o tempo passa.

Segundo recomendações da Anvisa a concentração aceitável de CO2 no ambiente interno contempla o intervalo entre 400 e 1.000 ppm (partes por milhão). Níveis de concentração acima do recomendado tem como uma das suas consequências a deterioração da função cognitiva.

O excesso de CO2 pode ter impactos negativos na função cognitiva, incluindo a memória, a concentração e a tomada de decisões. Isso ocorre porque o CO2 pode reduzir o fluxo sanguíneo para o cérebro, prejudicando a oxigenação e o metabolismo cerebral.

- Engepred - Excesso de CO2 no ar traz riscos à saúde e aos negócios

Adquiri um dispositivo com o objetivo de monitorar a concentração de CO2 no ambiente utilizado para performar minhas atividades laborais, e reduzir o impacto negativo da longa exposição a altos níveis de concentração de CO2 no ambiente. Trata-se do IAM-O2 da marca INKBIRD.

Rentabilidade

Experimento - Quanto tempo leva para que o nível de concentração de CO2 atinja patamares acima do recomendado? Em ambiente com janelas e portas fechadas

Dimensões do cômodo:

Rentabilidade

As medições normais da concentração de CO2 com janela e porta abertas giram em torno de 460 a 600 ppm.

Para mensurar quanto tempo leva para que a concentração de CO2 atinga níveis nocivos, fechei a porta do cômodo e também a janela, permaneci dentro do quarto atuando como uma fonte de CO2 durante a execução do experimento. Parei o cronometro e finalizei a coleta dos dados assim que atingimos uma concentração acima de 1400 ppm.

Levou cerca de 40 minutos para o nível de concentração de CO2 ultrapassar o limite máximo aceitável de 1000 ppm. E levou 1 hora e 25 minutos para atingir 1400 ppm. Como consequência da exposição a esse nível de concentração comecei a apresentar sintomas semelhantes ao de uma crise de enxaqueca.

Fique atento para a capacidade de ventilação do espaço que você usa para trabalhar ou estudar.

Published: 2025-10-04

Tagged: Produtividade Experimento Home Office

Archive