A blog about Software Engineering and other stuff not related to programming
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
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.
É 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.
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.
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:
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.
Published: 2025-11-13
Tagged: Schema Data Validation Clojure Coercion
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.
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.
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