Conforto proporcionado por refletir sobre consequências de segunda e terceira ordem

Esse é o segundo texto que escrevo sobre coisas incomuns que me proporcionam um certo nível de conforto e satisfação. Hoje é a vez de escrever sobre o desgaste de canetas esferográficas.

Primeiramente vamos deixar claro o que são consequências de primeira, segunda e terceira ordem. As consequências de primeira ordem são os resultados diretos e imediatos de uma decisão tomada. Já as consequências de segunda e terceira ordem são os efeitos de longo prazo resultantes dessa mesma decisão tomada.

Observar uma caneta completamente gasta, me faz refletir no esforço dedicado para que fosse usada até a última gota de tinta. As consequências de primeira ordem decorrentes do uso da caneta são as mais evidentes, a redução do nível de tinta e as marcas de uso visíveis no seu corpo. Já as consequências de segunda e terceira ordem requerem uma reflexão mais profunda, pois dependem do contexto em que foi utilizada.

O desgaste da caneta que foi de um estudante é composto por horas de estudo e foco direcionadas ao processo de aprendizagem. A caneta gasta no final do processo é uma espécie de troféu, foi preciso pagar um preço através do esforço para fazer a caneta chegar ao estado final de desgaste. As consequências de segunda e terceira ordem são a assimilação do conteúdo estudado, a boa nota obtida nas avaliações e o projeto colocado no papel e que hoje está em execução produzindo frutos.

A imagem da caneta gasta reflete o tempo investido no seu uso, investimento esse que no longo prazo rende dividendos. Apenas o dono da caneta consegue olhar para a caneta e refletir sobre as consequências de segunda e terceira ordem, para um observador externo é apenas uma caneta antiga que precisa ser substituída por uma nova.

Published: 2026-02-07

Tagged: Reflexão

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

Archive