A Jornada do Herói

Desde a antiguidade, o homem conta histórias e inventa mitos e fábulas para passar o conhecimento para as próximas gerações. A simbologia era importantíssima para os povos antigos explicarem os fenômenos naturais que observavam e como se deu a Criação. Os Doze Trabalhos de Hércules, por exemplo, contam como o herói grego Hércules enfrentou e derrotou criaturas lendárias e situações em que ele precisava utilizar a inteligência e não apenas a força física para vencer. Em cada trabalho realizado, vamos ficando mais conectados a esse personagem: torcemos para que ele vença e sofremos junto com ele, pois mesmo sendo um semi-deus, ainda assim era feito de carne e osso como nós.

Muitas histórias, embora totalmente diferentes, contêm elementos que nos trazem a sensação de repetição, que é algo do qual o nosso cérebro gosta bastante (conforto cognitivo) – é como se já tivéssemos visto alguma coisa similar em algum momento, mas não conseguíssemos nos lembrar exatamente de onde e nem de quando foi. E se alguém te dissesse que há uma conexão entre Hércules, Ulisses, Harry Potter, Frodo Bolseiro, Luke Skywalker, Mulan e a pequena sereia Ariel? Todos esses personagens são variantes de uma abstração que chamamos de herói.

Joseph Campbell (1904-1987) estudou e comparou muitos mitos, fábulas, histórias antigas – inclusive as religiosas – e modernas em busca de elementos similares que faziam a história cair no gosto popular. É importante ressaltar que para que um mito seja bom ele não precisa ser antigo, mas precisa ser profundo; precisa nos causar introspecção. Com seus resultados, Campbell escreveu em 1949 o livro The Hero with a Thousand Faces (O Herói de Mil Faces) e lá ele estruturou o conceito de mono-mito que mais tarde ficou conhecido como a Jornada do Herói. A Jornada do Herói é uma forma de se contar uma história baseada em uma espécie de ciclo bem definido que começa e termina no mundo normal do herói, mas a jornada conduz o herói a um mundo especial e desconhecido, às vezes fantástico, que apresenta determinados elementos aos quais um personagem invariavelmente será submetido para amadurecer e se tornar um herói.

Figura 1 – Joseph Campbell

O ciclo sozinho não explica integralmente porque gostamos do herói. Para aumentar a conexão entre o público e o herói, o autor deve dar atenção à construção do mundo ficcional onde o herói vive sua vida e suas aventuras. Esse mundo deve ser coerente dentro de sua própria ficção para que o enxerguemos como possível em determinado contexto bem definido. Não importa se nesse mundo as pessoas voam, se existem dragões e nem se existem varinhas mágicas. O importante é que o herói perceba esse mundo com naturalidade e que ele seja convincente para nós que não pertencemos aquele universo.

A jornada do herói tem 3 etapas (atos de um enredo) cada uma dividida em passos ou estágios que totalizam as 12 partes da Jornada do Herói estruturada por Campbell. Pontualmente, darei exemplos retirados do Hobbit e do Senhor dos Anéis, mas você poderia utilizar muitos outros exemplos que vão da mitologia grega até os filmes que passaram esse ano no cinema. Tratarei o personagem como “herói” em todos os momentos, pois a partir do momento em que ele é “infectado” pela aventura, um herói é o que ele invariavelmente se tornará em menor ou maior grau. Nem todos os passos, como por exemplo o Retorno, são necessários em todas as histórias, mas a maioria desses elementos pode ser encontrada em todas as histórias que nos cativam.

Ato 1 – Chamada

Etapa em que o herói anseia por sua jornada.

Passo 1 – Mundo Comum

Ambiente em que o herói vive sua vida comum junto com outras pessoas. Nesse momento, ele possui uma consciência limitada de algum problema e não sabe que será o protagonista da solução.

Passo 2 – O Chamado à Aventura

Um problema ou um desafio se apresenta e obriga o herói a sair de sua zona de conforto para se aventurar rumo ao desconhecido. Nesse momento, ele tem um aumento da sua consciência sobre o problema e sobre seu próprio papel na trama.

Passo 3 – Recusa ao Chamado ou Reticência do Herói

Mudanças são difíceis. O herói inicialmente não quer deixar sua vida comum, tem medo de falhar e se sente inseguro. Por isso, ele recusa ou demora para aceitar sua responsabilidade.

Passo 4 – Encontro com o Mentor ou Ajuda Sobrenatural

O herói se encontra com um mentor, sábio ou oráculo e recebe treinamento, conhecimento e/ou algum tipo de ajuda sobrenatural e supera sua relutância em aceitar o desafio, pois agora sabe mais sobre si mesmo e sobre o que precisa fazer.

Ex. 1: O Hobbit. Bilbo adorava fumar e comer. Para ele, essa era uma vida bem vivida. Até que um dia, chegam o mago Gandalf (Olórin para os deuses e Mithrandir para os elfos), O Cinza, e um grupo de anões liderados por Thorin “Escudo de Carvalho”, descendente de Durin, o mais importante rei dos anões. Bilbo foi contratado como o ladrão oficial da comitiva que iria atravessar as Montanhas Místicas rumo a Erebor, a Montanha Solitária, para matar o dragão Smaug e recuperar o ouro a tanto tempo roubado, mas em princípio relutou em aceitar essa demanda. Após um “empurrãozinho” de Gandalf, ele parte em sua jornada.

Ex. 2: O Senhor dos Anéis. Frodo Bolseiro cresceu no pacato Condado ouvindo as histórias fantásticas de seu tio Bilbo e queria muito estar em uma aventura com o ancião até que ele assumiu o fardo de carregar o Um Anel. Em princípio ele não queria essa responsabilidade, mas sob a orientação do mago Gandalf, ele iniciou sua jornada.

Ato 2 – Iniciação

Etapa mais interessante e normalmente a mais longa, pois é nela que o herói viverá suas aventuras.

Passo 5 – Cruzamento do Primeiro Portal

O herói consolida a aceitação do desafio, deixa o mundo comum e ultrapassa um portal concreto ou simbólico que o conduz a um mundo especial, mágico ou outra dimensão. Ao cruzar o portal, ele aceita o fato de que já é um novo ser.

Passo 6 – Provações, Aliados e Inimigos

O herói é testado física, emocional e espiritualmente ao enfrentar os desafios que se apresentam e vai aprendendo aos poucos as regras do mundo especial. Ao longo de sua jornada, ele encontra aliados e enfrenta inimigos cada vez mais poderosos.

Passo 7 – Aproximação do Objetivo

O herói tem sucesso em suas provações ao lado de seus aliados.

Passo 8 – Provação Difícil ou Traumática

A maior dificuldade à qual o herói será submetido o fará enfrentar seus maiores medos. É um caso de vida ou morte onde ele sofrerá.

Passo 9 – Conquista da Recompensa

O herói enfrentou a morte, superou seus medos e obteve a recompensa – o elixir.

Ex. 1: O Hobbit. Bilbo enfrenta os trolls e encontra uma adaga élfica que ele chamou de Ferroada depois de lutar contra aranhas gigantes na Floresta das Trevas. Ele encontrou um anel que concedia a invisibilidade a seu usuário e o utilizou para escapar das cavernas escuras das Montanhas Místicas, do malvado Gollum e dos orcs. A comitiva recebeu a ajuda do poderoso Beorn, um homem capaz de se transformar em urso. Ele enfrenta o dragão Smaug, ganha uma cota de malha feita de mithril e força a negociação da paz entre anões, elfos e homens utilizando a pedra Arken.

Ex. 2: O Senhor dos Anéis. Frodo cruzou a plantação que marcava o ponto mais distante do Condado em que já estivera. Ele enfrentou os espectros do anel e foi ferido. Ele foi o pivô da Sociedade do Anel ao se mostrar o único disposto a carrega o Um Anel até Mordor. Com seus novos aliados, ele inicia sua jornada, que sofrerá um revés. Junto com seu amigo Sam, ele completa sua jornada, mas não consegue atirar o anel no fogo do vulcão em Mordor. Mesmo assim, o anel e o malvado Gollum são destruídos na lava e a ameaça da volta de Sauron termina.

Ato 3 – Retorno

Etapa que consolida o amadurecimento e a sagração do herói. Ele volta para sua terra com mais sabedoria e poderes.

Passo 10 – O Retorno ou O Caminho de Volta

O herói inicia o retorno para o mundo comum de onde partiu.

Passo 11 – Ressurreição

O herói passa por um último teste antes de sua sagração. Ele deve enfrentar novamente o perigo e a morte, mas agora ele tem conhecimentos e habilidades que devem ser utilizadas com sabedoria.

Passo 12 – Regresso com a Fórmula ou Elixir

O herói volta para o mundo comum carregando o elixir e o utiliza para ajudar seu povo

Ex. 1: O Hobbit. Bilbo volta para casa carregando os itens que ganhou ou encontrou e ainda recupera uma arca com o ouro dos trolls que foi escondida no início da viagem. Chegando em casa, ele tem que provar que não havia morrido e gasta muito dinheiro e tempo para encontrar e comprar de volta sua mobília, mas ele nunca mais encontrou sua prataria – ele suspeita que ela ficou com seus primos, os Sacola Bolseiros.

Ex. 2: O Senhor dos Anéis. Frodo volta para casa com seus amigos, mas chegando ao Condado ele descobre que seu povo foi escravizado por Saruman, que agora não tinha mais poderes mágicos. Seus amigos utilizam todo o conhecimento que adquiriram na jornada para organizar uma rebelião e derrotar o invasor.

Análise

Na caverna que você tem medo de entrar está o tesouro que você busca.

Joseph Campbell

Nossa vida tem ritos de passagem que nos conduzem ao próximo estágio. Ela pode ser comparada a uma viagem de trem [4] com suas múltiplas estações. Em cada estação que paramos, acumulamos conhecimentos que nos tornam mais sábios ao fim da jornada. Se nos recusarmos a descer em uma estação, nossa jornada fica comprometida e em seu desfecho ainda não teremos atingido a maturidade esperada. A Jornada do Herói pode estar contido em algo temporalmente longo como nossa vida, em algo épico como as tramas dos filmes dos quais gostamos ou até mesmo em nossa rotina.

Analise a seguinte rotina que inventei: você levanta da cama, desliga o despertador, toma café da manhã, se arruma para sair e vai trabalhar. No caminho, enfrenta multidões se acotovelando no transporte público, metrô com problemas, acidentes pela cidade, e etc. No trabalho, você enfrenta novos problemas todos os dias ou pior: enfrenta os mesmos problemas todos os dias. Saindo do trabalho cansado, ainda enfrenta pontos de alagamento pela cidade, falta de energia e demora horas para chegar em casa. Chegando em casa, sua esposa reclama do atraso, do dia ruim que ela também teve no trabalho e seus filhos demandam sua atenção. Mesmo esgotado, você conversa com sua companheira e dá todo o carinho possível para seus filhos, toma banho, come alguma coisa e dorme. Tudo que ocorreu com você durante o dia o tornou um pouco diferente ao final do dia, mas a rotina torna isso quase imperceptível.

Por que gostamos da Jornada do Herói? O mito da Jornada do Herói existe desde o mundo antigo e fala de humanos ou de pessoas que têm características humanas, ou seja, até certo ponto são como nós: têm medo, são obrigados a enfrentar desafios, se machucam, sofrem e voltam para casa um pouco melhores do que quando saíram. Em algum momento precisamos deixar nossa zona de conforto para ter uma experiência transformadora e isso é o que se repete em nossas vidas tal como na Jornada do Herói mesmo que não precisemos enfrentar dragões em nossas andanças. Esse mito está sempre sendo atualizado porque nós humanos refletimos sobre nosso mundo e nossos símbolos, porém, a formulação continua sendo a mesma. A caverna simbólica de Campbell é o nosso medo do desconhecido, como a mudança de emprego, por exemplo. Esse paralelo entre a saga de um personagem em um filme ou livro e nossa própria história é o que nos conecta àquela fantasia.

O ‘poderoso herói’ somos cada um de nós; não o ‘eu físico’, mas o Rei que se encontra em nosso íntimo. ‘Sou o Eu que reside no coração de todas as coisas’.

Bhagavad Gita

Não é regra, mas a Jornada do Herói pode ser a fórmula de sucesso até de filmes ruins. É por esse motivo que ela é muito utilizada na indústria do cinema, em livros e até como ferramenta de motivação nas empresas e de organização de metas para executivos. As empresas já perceberam também que uma história bem contada conecta o público à marca – uma narrativa que engaja. Isso funciona porque uma boa história nos conecta ao personagem e dá uma sensação de “nós” quando cria um conflito com “eles”.

Figura 2 – Lá e de volta outra vez: a síntese da Jornada do Herói

Referências

1. WINKLER, Matthew. O que faz um herói?. TED-Ed. Disponível em: [https://www.youtube.com/watch?v=Hhk4N9A0oCA]. Acesso em 15 jan. 2019.

2. MESSNER, Kate. Como construir um mundo ficcional. TED-Ed. Disponível em: [https://www.youtube.com/watch?v=ZQTQSbjecLg]. Acesso em 29 jan. 2019.

3. HUMANIDADE, Conhecimentos da. Senhor dos Anéis e a Jornada do Herói. Disponível em: [https://www.youtube.com/watch?v=MN1wGwvpsjM]. Acesso em 15 jan. 2019.

4. GALVÃO, LÚCIA HELENA. HERÓI DE MIL FACES 01 – Introdução. NOVA ACRÓPOLE – Escola Internacional de Filosofia. Disponível em: [https://www.youtube.com/watch?v=TY9Te2Q-3mw]. Acesso em 11 fev. 2019a.

5. ______. HERÓI DE MIL FACES 02 – Parte 1, Cap. 1 – O Chamado. NOVA ACRÓPOLE – Escola Internacional de Filosofia. Disponível em: [https://www.youtube.com/watch?v=QWltw7zIwi0]. Acesso em 11 fev. 2019b.

6. ______. HERÓI DE MIL FACES 03 – Parte 1, Cap. 2 – A Iniciação. NOVA ACRÓPOLE – Escola Internacional de Filosofia. Disponível em: [https://www.youtube.com/watch?v=ZPL_1smCUSM]. Acesso em 11 fev. 2019c.

7. ______. HERÓI DE MIL FACES 04 – Parte 1, cap. 2 – A Iniciação (cont.) e cap. 3 – O Retorno (início). NOVA ACRÓPOLE – Escola Internacional de Filosofia. Disponível em: [https://www.youtube.com/watch?v=0BiJ_7qINpo]. Acesso em 11 fev. 2019d.

8. ______. HERÓI DE MIL FACES 05 – Parte 1, cap. 3 – O Retorno (final). NOVA ACRÓPOLE – Escola Internacional de Filosofia. Disponível em: [https://www.youtube.com/watch?v=t9LluireTPA]. Acesso em 11 fev. 2019e.

9. ______. HERÓI DE MIL FACES 06 – Parte 1, cap. 4 e Parte 2, cap. 1. NOVA ACRÓPOLE – Escola Internacional de Filosofia. Disponível em: [https://www.youtube.com/watch?v=CTrD77eeVZ]. Acesso em 11 fev. 2019f.

10. ______. HERÓI DE MIL FACES 07 – Parte 2, cap. 2 e 3. NOVA ACRÓPOLE – Escola Internacional de Filosofia. Disponível em: [https://www.youtube.com/watch?v=U4-mvvaobAU]. Acesso em 11 fev. 2019g.

11. ______. HEROI DE MIL FACES 08 – Parte 2, cap. 4 – FINAL. NOVA ACRÓPOLE – Escola Internacional de Filosofia. Disponível em: [https://www.youtube.com/watch?v=3MicxeAGXFo]. Acesso em 11 fev. 2019h.

Anúncios

Expandido a Explicação do Fatorial de Zero Igual a Um

Faz algum tempo, escrevi um artigo para explicar o porquê de:

0! = 1

Naquele artigo, expus duas explicações ancoradas na análise combinatória e na indução matemática. Nesse artigo, vou expandir a explicação da indução de acordo com um vídeo de Eddie Woo e outro vídeo do canal blackpenredpen, mas vou acrescentar uma outra explicação.

1. Expandindo a Indução Matemática

A versão, digamos assim, alpha, é a do meu outro artigo, que também contém a prova por análise combinatória. Aqui, vamos expandir a ideia da indução. Veja algumas potenciações envolvendo o número 2:

21 = 2
22 = 2 x 2 = 4
23 = 2 x 2 x 2 = 4 x 2 = 8
24 = 2 x 2 x 2 x 2 = 8 x 2 = 16
25 = 2 x 2 x 2 x 2 x 2 = 16 x 2 = 32

Perceba que cada número vale o dobro do anterior:

2n = (2n-1) x 2

Não há porque duvidarmos de que essa regra se aplica na direção inversa uma vez que a operação inversa da multiplicação é a divisão:

2n = (2n+1) ÷ 2

E desenvolvendo:

24 = 32 ÷ 2 = 16
23 = 16 ÷ 2 = 8
22 = 8 ÷ 2 = 4
21 = 4 ÷ 2 = 2
20 = 2 ÷ 2 = 1
2-1 = 1 ÷ 2 = ½
2-2 = ½ ÷ 2 = ¼

Agora, vejamos alguns fatoriais:

1! = 1
2! = 2 x 1 = 2
3! = 3 x 2 x 1 = 6
4! = 4 x 3 x 2 x 1 = 24
5! = 5 x 4 x 3 x 2 x 1 = 120

Observando esses fatoriais, abstraímos o seguinte:

n! = n x (n – 1)!

E na ordem inversa, observamos o seguinte:

n! = (n – 1)! ÷ n
5! = 5 x 4 x 3 x 2 x 1 = 120
4! = 4 x 3 x 2 x 1 = 24 → 120 ÷ 5
3! = 3 x 2 x 1 = 6 → 24 ÷ 4
2! = 2 x 1 = 2 → 6 ÷ 3
1! = 1 → 2 ÷ 2
0! = 1 → 1 ÷ 1

2. Função Gama

Em outro artigo, apresentei a Função Gama:

Em seguida, fiz a seguinte conexão com os fatoriais:

n! = Γ(n+1)

Essa relação nos permite calcular 0! da seguinte forma:

0! = Γ(0+1) = Γ(1)

Ou seja:

Categorias:Matemática Tags:

A Origem dos Termos Fulano, Sicrano e Beltrano

Veja a tirinha abaixo:

“Quem é aquele fulano?” Você já se perguntou de onde vêm as palavras “fulano”, “sicrano” e “beltrano”? Cada uma dessas palavras tem uma origem diferente:

1. Fulano: vem do árabe fulân (tal) em função do domínio islâmico sobre a península Ibérica. No século 13, os espanhóis utilizam a palavra como pronome: fulana casa (tal casa). Em português, virou substantivo e em Portugal utiliza-se também a forma “fuão”;

2. Beltrano: vem do francês Beltrand (Beltrão). A terminação “ano” se deve á influência da palavra “fulano”, que já era muito utilizada na época;

3. Sicrano: há três hipóteses para a origem da palavra “sicra”:
3.1. Derivado da palavra latina securu
3.2. Derivado do desfiguramento de um nome próprio
3.3. De uma mistura de zutano e citano, que equivalem à “fulano” e “beltrano” em espanhol.

Referências

1. LAZARETTI, Bruno. De onde vêm os termos “fulano”, “beltrano” e “sicrano”?. Super Interessante. Disponível em: [https://super.abril.com.br/mundo-estranho/de-onde-vem-os-termos-fulano-beltrano-e-sicrano/]. Acesso em 26 mar. 2019.

Categorias:Geral

Boa Prática para utilização de Chave Estrangeira no Relacionamento @OneToMany no Hibernate

Suponha que tenhamos um relacionamento UM PARA MUITOS entre as tabelas TBL_PESSOA e TBL_PET:

CREATE TABLE TBL_PESSOA(  
  PK_PESSOA NUMBER(10) NOT NULL, 
  NM_PESSOA    VARCHAR2(256) NOT NULL, 
 CONSTRAINT PK_PESSOA PRIMARY KEY (PK_PESSOA)
);
 
CREATE TABLE TBL_PET( 
  PK_PET NUMBER(10) NOT NULL, 
  FK_PESSOA NUMBER(10) NOT NULL, 
  NM_PET    VARCHAR2(256) NOT NULL, 
  CONSTRAINT PK_PET PRIMARY KEY (PK_PET),
  CONSTRAINT FK_PET_PESSOA FOREIGN KEY (FK_PESSOA)
  REFERENCES TBL_PESSOA(PK_PESSOA)
);

Esse relacionamento é normalmente mapeado assim no Hibernate:

@Entity
@Table(name = "TBL_PESSOA")
public class Pessoa {
   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   @Column(name = "PK_PESSOA")
   private Long id;
 
   @OneToOne(cascade = CascadeType.ALL)
   @JoinColumn(name = "FK_PESSOA", referencedColumnName = "PK_PESSOA")
   private Pet pet;
}
 
@Entity
@Table(name = "TBL_PET")
public class Pet {
   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   @Column(name = "PK_PET")
   private Long id;
 
   @JoinColumn(name = "FK_PESSOA")
   private Pessoa pessoa;
 
}

Como FK_PESSOA é NOT NULL em TBL_PET, a exceção abaixo será lançada no momento da persistência:

Caused by: java.sql.BatchUpdateException: ORA-01400: 
cannot insert NULL into ("TBL_PET"."FK_PESSOA")

O problema é que o Hibernate está tentando persistir a coleção de Pet antes de gravar Pessoa e a chave estrangeira de Pessoa é obrigatória para gravar um Pet. Contornamos esse problema dizendo explicitamente para o Hibernate que a chave estrangeira é não nula (nullable = false). Dessa forma, o Hibernate é forçado a persistir pessoa e em seguida persistir Pet:

@Entity
@Table(name = "TBL_PESSOA")
public class Pessoa {
   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   @Column(name = "PK_PESSOA")
   private Long id;
 
   @OneToOne(cascade = CascadeType.ALL)
   @JoinColumn(name = "FK_PESSOA", referencedColumnName = "PK_PESSOA",
   nullable = false)
   private Pet pet;
}

Referências

1. [http://eells.consulting/2011/01/09/hibernate-foreign-key-collections-database-best-practice/]

A Importância dos Adversários

Instintivamente, encaramos nossos adversários como inimigos e adotamos uma postura negativa para com eles. Parece que é da natureza humana nos aproximarmos de certas pessoas e repelirmos outras às vezes sem um motivo aparente. Um inimigo é um agente nocivo que faz o que estiver ao alcance dele para nos prejudicar e sente prazer ao assistir nossa queda. Por outro lado, adversários são pessoas com as quais nos confrontamos em diversas situações no trabalho, na escola e etc. e que são importantes para nosso crescimento.

O professor Mário Sérgio Cortella contou que na PUC de São Paulo um colega de outro departamento e ele se odeiam faz mais de 30 anos, mas os dois sempre se respeitaram. Ele disse que as críticas desse colega o tornam mais forte, pois ele se vê obrigado a revisar o que escreve e embasar melhor o conhecimento que possui. Quando esse colega falecer, o professor estará ajudando a segurar o caixão, mas com lágrimas nos olhos, pois à partir daquele momento ele estará mais fraco – a pessoa que o tirava do comodismo e que o obrigava a ir mais longe terá deixado de existir.

Em um clube que frequento, um adolescente estava me contando sobre o último campeonato que participou. Ele disse que odiava o oponente que o derrotou porque não viu meios de vencê-lo. Uma forma de deixar mais clara a mensagem que quero passar é exagerar nos detalhes. Expliquei que ele não precisaria matar seu oponente. Perguntei o que aquele oponente fazia de diferente e ele foi contando. Perguntei onde ele estava errando e ele foi descrevendo. Aí expliquei que ele deveria ser grato pela oportunidade de enfrentar alguém mais experiente, pois isso nos obriga a aprender coisas novas e melhorar constantemente. Como todo adolescente médio, ele fingiu que entendeu e foi embora, mas acredito que ele vai se lembrar dessa conversa quando tiver mais maturidade e acumular mais experiências.

Quando aconselhei meu colega de clube, estava falando de mim mesmo. Comecei a participar de campeonatos amadores por aí, mas nas duas vezes em que participei, perdi para o mesmo cara e na mesma etapa (oitavas de final). Na primeira vez fiquei bem chateado, mas analisei os vídeos do jogo e vi que errei bastante. Corrigi meus defeitos e ainda assim perdi na segunda vez em que o enfrentei, mas foram outros os motivos – meu adversário também evoluiu. Na terceira vez que participei do campeonato, estabeleci dois objetivos: chegar nas quartas de final ou pelo menos vencer aquele cara, pois realmente não me importo com os resultados dos jogos se conseguir me divertir e me superar. E não é que enfrentei o cara nas quartas de final? Quando nos vimos, os dois levamos a mão direita à testa e sorrimos, pois havíamos ficado amigos. Porém, percebi certo nervosismo nele, coisa que eu não tinha. Venci e foi um grande jogo. Meu adversário veio me cumprimentar sorrindo e todas as pessoas que estavam assistindo e que já me conheciam me parabenizaram porque viram minha evolução nos campeonatos e minha adaptação naquele jogo.

O tcheco Emil Zatopek (1922-2000), a “Locomotiva Humana”, foi um dos maiores maratonistas do século XX. Ele foi o único que venceu os 5000 metros, os 10000 metros e a maratona numa mesma Olimpíada nos Jogos Olímpicos de Helsínquia, Finlândia, em 1952. O argelino Alain Mimoun (1921-2013) tinha grande talento nas pistas, mas o máximo que conseguia era um segundo lugar quando seu adversário era Zatopek. Embora rival nas pistas, Mimoun não via Zatopek como inimigo. Ele acreditava que sem Zatopek ele não seria nada e para ele o tcheco era seu melhor amigo. Em 1956, na Austrália, Mimoun correu os 42 km da maratona e venceu debaixo de um sol escaldante. Após cruzar a linha de chegada, Mimoun seguiu para a beira da pista para torcer e incentivar o maior rival e amigo:

Eu corri ali pro lado da pista pra ver onde ele estava e fui aplaudindo seu caminho. Ele chegou exaurido, em sexto lugar, e caiu de joelhos. Eu fui até lá, o levantei e disse: ‘Emil, Emil, você não me vai dar os parabéns? Eu ganhei, finalmente!’ O rosto dele se iluminou. Ele me abraçou e disse: ‘você é um grande campeão. Estou contente por você.’ Nunca vou me esquecer disso. Ele comemorou como se fosse uma vitória pessoal.

Figura 1 – Mimoun (esquerda) e Zatopek (direita): rivais e amigos

Tenho um grande respeito pelos adversários que já tive. Muitas vezes, quando exercito uma habilidade que não possuía, me lembro claramente do adversário que me ajudou a desenvolvê-la: muito do que aprendi foi fruto de esforço motivado pelas derrotas que sofri. Às vezes, enfrento adversários antigos que eu não conseguia vencer, mas hoje os derroto com relativa facilidade. Mesmo assim, agradeço, e sempre vou agradecer, pela excelente disputa que acabamos de travar. Não é necessário fazer amizade com seus adversários, mas é importante que você os analise em busca daquilo que falta em você para ser cada vez melhor.

Implementando um Chat com WebSocket

Quando um navegador acessa uma página web, uma request HTTP (Hypertext Transfer Protocol) é enviada para o servidor que responde por aquela página e este envia uma response. Esse comportamento se deve à natureza half-duplex do protocolo HTTP: o fluxo do tráfego é permitido em apenas uma direção por vez. Sendo assim, para ter a versão mais atualizada da página, você deve fazer o refresh dela frequentemente.

É difícil implementar comunicação em tempo real sob um modelo half-duplex. Por isso, há várias técnicas que foram tentadas historicamente para se obter comunicação em tempo real na web:

1. Ajax: permite que algumas partes de uma página web sejam atualizadas assincronamente com dados obtidos de um servidor sem a necessidade de atualizar a página inteira;

2. Polling: o cliente faz uma requisição periódica ao servidor em um intervalo específico de tempo;

3. Comet: modelo de aplicação web que permite que um servidor envie dados para o navegador sem que o navegador os solicite explicitamente;

4. Long-Polling: o navegador faz uma requisição e o servidor fica aguardando durante um período de tempo. Se não houver resposta, o servidor termina a requisição;

5. Streaming: a conexão é aberta pelo browser, mas nunca é fechada.

Todos esses métodos envolvem trocas de headers HTTP de request e response, o que aumenta a quantidade de dados desnecessários e da latência. Para simular uma conexão full-duplex com HTTP, são necessárias duas conexões TCP (Transmission Control Protocol), o que aumenta o overhead e a complexidade.

O WebSocket é um protocolo definido na RFC 6455 que permite a comunicação bidirecional em canais full-duplex sobre o mesmo socket na mesma conexão TCP. Como você perceberá, essa tecnologia não é apenas mais uma melhoria nas comunicações HTTP.

Para estabelecer uma conexão WebSocket, o cliente e o servidor atualizam o protocolo de HTTP para WebSocket durante o handshake inicial sob a mesma conexão TCP/IP. Esse objeto criado contém a URL do end-point em que será conectado. O prefixo ws:// representa uma conexão WebSocket normal e o prefixo wss:// representa uma conexão WebSocket segura.

No cabeçalho da request, o cliente insere um atributo chamado Sec-WebSocket-Key, que é um base 64 interpretado pelo servidor que responderá com um hash da chave no atributo da response Sec-WebSocket-Accept. O objetivo desses atributos é evitar cache de proxy e não garantir autenticação, privacidade e integridade.

Uma vez que a conexão tenha sido estabelecida, frames de dados podem ser enviados nos dois sentidos entre o cliente e o servidor em modo full-duplex pelo protocolo WebSocket. Em seguida, o cliente pode interagir com o servidor através dos métodos disponíveis na API (Application Programming Interface).

Exemplo 1: Echo

Baseado no exemplo de [3], vamos implementar um chat com WebSocket. Nossa tela ficará assim:

Vamos criar uma página HTML bem simples:

<!DOCTYPE html>
<html>
    <head>
        <title>WebSocket</title>
        <meta charset="UTF-8">
    </head>
    <body>
          <h1>Um CHAT com WebSocket</h1>

          <div id="status">Estabelecendo a conexão...</div>

          <ul id="lista"></ul>

          <form id="formulario" action="#" method="post">
              <textarea id="mensagem" placeholder="Descreva sua duvida..." 
                 required></textarea>
              <button type="submit">Enviar mensagem</button>
              <button type="button" id="fechar">Fechar conexão</button>
          </form>
        <script src="client.js"></script>
    </body>
</html>

Em seguida, vamos criar o javascript cliente onde será definida a comunicação com um servidor WebSocket de echo. O conteúdo das mensagens enviadas para o servidor de echo será retransmitido para o cliente. Esse script abre a conexão com o servidor WebSocket, trata possíveis erros e define uma ação para o botão “Enviar mensagem”:

window.onload = function() {
    var form = document.getElementById('formulario');
    var mensagem = document.getElementById('mensagem');
    var lista = document.getElementById('lista');
    var status = document.getElementById('status');
    var btnFechar = document.getElementById('fechar');
    
    var socket = new WebSocket('ws://echo.websocket.org');
    
    socket.onerror = function(error) {
      console.log('erros do WebSocket: ' + error);
    };
    
    socket.onopen = function(event) {
      status.innerHTML = 'Conectado com: <strong>' + event.currentTarget.url 
      + '</strong>';
    };
    
    socket.onmessage = function(event) {
      var mensagem = event.data;
      lista.innerHTML += '<li class="recebida"><span>Recebida:</span>' +
                                 mensagem + '</li>';
    };
    
    socket.onclose = function(event) {
      status.innerHTML = 'Desconectado';
    };
    
    form.onsubmit = function(e) {
      e.preventDefault();
      socket.send(mensagem.value);
      lista.innerHTML += '<li><span>Enviada:</span>' + mensagem.value + '</li>';
      mensagem.value = '';
      return false;
    };

    btnFechar.onclick = function(e) {
      e.preventDefault();
      socket.close();
      return false;
    };
  };

Exemplo 2: Node.js

Nesse segundo exemplo, implementaremos nosso próprio servidor WebSocket com Node.js, que permite a execução de JavaScript do lado do servidor. Em um artigo sobre o Gulp, expliquei detalhadamente como trabalhar com o servidor e suas dependências. Supondo que você já tem o Node instalado, rode o comando abaixo para instalar a dependência necessária:

npm install websocket

No script do cliente, altere a URL do servidor para trocarmos do echo para nossa implementação que roda em localhost na porta 3210:

var socket = new WebSocket('ws://localhost:3210');

Crie o script abaixo como nome “server.js”. Ele define como o servidor tratará as mensagens recebidas:

var WebSocketServer = require('websocket').server;
var http = require('http');
var port = 3210;
var server = http.createServer(function(request, response) {});

server.listen(port, function() {
  console.log("WS Server ouvindo a porta [" + port + "]");
  console.log("Iniciado em: " + (new Date()));
});

// cria o servidor
wsServer = new WebSocketServer({
  httpServer: server
});

// tratamento das requisicoes
wsServer.on('request', function(request) {

  var connection = request.accept(null, request.origin);

  // trata as mensagens recebidas
  connection.on('message', function(message) {
    if (message.type === 'utf8') {
      // processa a mensagem WebSocket e a devolve no formato JSON
      connection.sendUTF(
            JSON.stringify({ data: message.utf8Data }));
    }
  });

  connection.on('close', function(connection) {
    console.log("Conexao fechada em " + (new Date()));
  });
});

Para subir o servidor com o script que definimos, rode o comando abaixo:

node server.js

Exemplo 3: Wildfly

No terceiro exemplo, utilizaremos o Wildfly como WebSocket Server. No script do cliente, altere a URL do servidor para trocarmos do echo para nossa implementação que roda em localhost na porta 8080:

var socket = new WebSocket('ws://localhost:8080/socket');

Adicione a dependência abaixo no POM:

<dependency>
   <groupId>org.jboss.spec.javax.websocket</groupId>
   <artifactId>jboss-websocket-api_1.0_spec</artifactId>
   <version>1.0.0.Final</version>
   <scope>provided</scope>
</dependency>

Crie o POJO abaixo:

public class Message {
   private String message;
   public String getMessage() {
      return message;
   }
   public void setMessage(String message) {
      this.message = message;
   }
}

Crie o Encoder abaixo. Essa classe criará um JSON à partir da mensagem recebida e o devolverá para o cliente:

import javax.json.Json;
import javax.json.JsonObject;
import javax.websocket.EncodeException;
import javax.websocket.Encoder;
import javax.websocket.EndpointConfig;
public class MessageEncoder implements Encoder.Text<Message> {
   @Override
   public String encode(Message message) throws EncodeException {
      JsonObject jsonObject = Json.createObjectBuilder()
        .add("data", message.getMessage()).build();
      return jsonObject.toString();
   }
   @Override
   public void init(EndpointConfig ec) {
   }
   @Override
   public void destroy() {
   }
}

Por último, crie o ServerEndpoint que responderá ás requisições ao WebSocket /socket:

import java.io.IOException;
import java.util.Date;
import javax.websocket.CloseReason;
import javax.websocket.EncodeException;
import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;

@ServerEndpoint(value = "/socket", 
encoders = { MessageEncoder.class })
public class WSServer {
   @OnOpen
   public void onOpen(Session session) {
      System.out.println("Iniciada em " + (new Date()));
      System.out.println("Sessao [" + session.getId() + "]");
   }

   @OnMessage
   public void onMessage(String message, Session session) 
         throws IOException, EncodeException {
      Message response = new Message();
      response.setMessage(message);
      session.getBasicRemote().sendObject(response);
   }

   @OnClose
   public void onClose(CloseReason motivo) {
      System.out.println("Conexao fechada em " + (new Date()));
      System.out.println("Motivo " + motivo);
   }
}

Suba o servidor e teste o cliente.

Exemplo 4: Wildfly + HTTP Apache

Para o último exemplo, integraremos o que já criamos para o Wildfly com o Apache. Primeiro, mapeie a URL socket.com.br para localhost no seu arquivo hosts:

127.0.0.1  socket.com.br
localhost  socket.com.br

Configure seu navegador para descartar a URL que definimos. No arquivo httpd-vhosts.conf do seu Apache (provavelmente do XAMPP), defina o virtual host abaixo:

<VirtualHost  socket.com.br:80>
    ServerName  socket.com.br
    ServerAlias  socket.com.br              
    Options FollowSymLinks Indexes MultiViews Includes
    RewriteEngine On
    RewriteRule /socket ws://localhost:8080/socket [P]
</VirtualHost>

O interessante nesse virtual host é a instrução RewriteRule. O parâmetro [P] utiliza o mod_proxy para delegar o tratamento da request para um servidor de backend – no caso, o Wildfly. No script do cliente, altere a URL do servidor para a URL que definimos:

var socket = new WebSocket('ws://socket.com.br/socket');

Suba o servidor de aplicação e o Apache e faça o teste.

Referências

1. APRESS. Pro HTML5 Programming – Using the WebSocket API. Disponível em: [http://apress.jensimmons.com/v5/pro-html5-programming/ch7.html]. Acesso em 19 mar. 2019.

2. LIN, Jia-Wei. Research of Web Real-Time Communication Based on WebSocket. SlidePlayer. Disponível em: [https://slideplayer.com/slide/12291546/]. Acesso em 19 mar. 2019.

3. DIONISIO, José Edson. Uso de WebSockets e HTML5. DevMedia. Disponível em: [https://www.devmedia.com.br/uso-de-websockets-e-html5/32267]. Acesso em 19 mar. 2019.

4. SIKORA, Martin. Node.js & WebSocket — Simple chat tutorial. Medium. Disponível em: [https://medium.com/@martin.sikora/node-js-websocket-simple-chat-tutorial-2def3a841b61]. Acesso em 19 mar. 2019.

5. MATEVOSYA, Johannes. server.js. GitHubGist. Disponível em: [https://gist.github.com/johannesMatevosyan/5ec0f7139c1804cc3bbb]. Acesso em 19 mar. 2019.

A Estatística do Segundo Dígito

Em outro artigo, expliquei em detalhes a famosa Lei de Benford, que originalmente era denominada Lei dos Números Anômalos, mas também é conhecida como Estatística do Primeiro Dígito, pois a Lei prevê que os dígitos de 1 à 9, desde que apresentados como o primeiro dígito de um número, têm uma frequência própria e previsível de aparição. Mais especificamente:

P(1) = 0,30103 = 30,103%
P(2) = 0,17609 = 17,609%
P(3) = 0,12494 = 12,494%
P(4) = 0,09691 = 9,6910%
P(5) = 0,07918 = 7,9180%
P(6) = 0,06695 = 6,6950%
P(7) = 0,05799 = 5,7990%
P(8) = 0,05116 = 5,1160%
P(9) = 0,04576 = 4,5760%

Sendo assim, quando analisamos um conjunto numérico razoavelmente grande composto, digamos, por algumas centenas ou milhares de números aleatórios, é previsto, por exemplo, que o número (1) se apresente como primeiro dígito em mais ou menos 30% dos casos. Essa frequência esperada é utilizada, dentre outras coisas, para detecção de fraudes contábeis. Quando utilizada com essa finalidade, a Lei ganha um forte apelo emocional junto aos CEOs e pode ser chamada de Estatística do Ladrão. No outro artigo, utilizei a Lei para enquadrar o PT com relação às doações de campanha declaradas na disputa pelo governo de São Paulo em 2014. Havia diferença nos primeiros 5 dígitos quando comparados à Benford.

Mostrei uma prévia do artigo para um colega e ele questionou a natureza dos eventos: a comparação de dois produtos diferentes, por exemplo, vendidos no mesmo mês por um estabelecimento comercial. Benford se aplica quando os eventos são da mesma natureza e os números são formados aleatoriamente. Um ótimo exemplo são as notas fiscais emitidas por um posto de gasolina em um mês: sempre que se abastece inteiramente um tanque, o valor raramente é preciso e repetitível.

Você deve estar se perguntando se é apenas o primeiro dígito que têm uma frequência previsível. A resposta é não. Os demais dígitos que sucedem o primeiro na sequência também têm suas próprias frequências. Nesse artigo, vamos analisar o comportamento do Segundo Dígito, mas sugiro que primeiro você leia o artigo onde trato da Lei de Benford.

A Prova Matemática da Frequência do Segundo Dígito

Abaixo, segue uma tabela com todas as possibilidades de números cujo primeiro e o segundo dígito variam de 0 à 9 no intervalo [0,99].

00-01-02-03-04-05-06-07-08-09
10-11-12-13-14-15-16-17-18-19
20-21-22-23-24-25-26-27-28-29
30-31-32-33-34-35-36-37-38-39
40-41-42-43-44-45-46-47-48-49
50-51-52-53-54-55-56-57-58-59
60-61-62-63-64-65-66-67-68-69
70-71-72-73-74-75-76-77-78-79
80-81-82-83-84-85-86-87-88-89
90-91-92-93-94-95-96-97-98-99

A primeira linha será descartada, pois o zero à esquerda inflacionaria os resultados e, o que é curioso, ela representa os próprios números que compõe o estudo do primeiro dígito. Na análise que faremos à seguir, estamos interessados em todas as possibilidades de que o segundo dígito sorteado seja aquele fixado em uma determinada coluna. A probabilidade da união é dada por:

P(A U B) = P(A) + P(B) – P(A ∩ B)

Como não há intersecção de eventos, vamos considerar apenas o somatório e descartar a intersecção.

1. Análise do Segundo Dígito Fixado em (1)

Vamos analisar o comportamento do segundo dígito fixado em (1) presente na coluna destacada abaixo:

10-11-12-13-14-15-16-17-18-19
20-21-22-23-24-25-26-27-28-29
30-31-32-33-34-35-36-37-38-39
40-41-42-43-44-45-46-47-48-49
50-51-52-53-54-55-56-57-58-59
60-61-62-63-64-65-66-67-68-69
70-71-72-73-74-75-76-77-78-79
80-81-82-83-84-85-86-87-88-89
90-91-92-93-94-95-96-97-98-99

Essa coluna fixa o segundo dígito em (1) e varia o primeiro dígito no intervalo [1, 9]:

S1 = {11, 21, 31, 41, 51, 61, 71, 81, 91}

A probabilidade de sortearmos um número cujo segundo dígito seja (1) é dada por:

P(S1) = P(11) + P(21) + P(31) + P(41) + P(51) + P(61) + P(71) + P(81) + P(91)

No espaço amostral considerado (10 números na linha), qual é a probabilidade de sortearmos o número 11? É 1/10. E o número 21? É 1/10. E quaisquer outros números do conjunto S1? É 1/10. Que pena! Teremos que recorrer ao mesmo artifício utilizado no artigo sobre o primeiro dígito para “forçar” a tendência de um número a ficar mais evidente. Vejamos o que ocorre com P(11) quando aplicamos uma transformação logarítmica:

P(11) = 1/10
P(11) = (12-11)/10
P(11) = 12/10 – 11/10
P(11) = log(12)/log(10) – log(11)/log(10)
P(11) = log(12)/1 – log(11)/1
P(11) = log(12) – log(11)
P(11) = log(12/11)
P(11) = log[(11+1)/11]
P(11) = log(11/11 + 1/11)
P(11) = log(1 + 1/11)

2. Análise do Segundo Dígito Fixado em (5)

Poderíamos analisar mais alguns ou todos os outros dígitos terminados em (1), mas vamos partir para algum número de outra coluna apenas para abstrair uma regra que valha para todos os números.

10-11-12-13-14-15-16-17-18-19
20-21-22-23-24-25-26-27-28-29
30-31-32-33-34-35-36-37-38-39
40-41-42-43-44-45-46-47-48-49
50-51-52-53-54-55-56-57-58-59
60-61-62-63-64-65-66-67-68-69
70-71-72-73-74-75-76-77-78-79
80-81-82-83-84-85-86-87-88-89
90-91-92-93-94-95-96-97-98-99

Observe o conjunto representado pela coluna S5. Essa coluna fixa o segundo dígito em (5) e varia o primeiro dígito no intervalo [1, 9]:

S5 = {15, 25, 35, 45, 55, 65, 75, 85, 95}

A probabilidade de sortearmos um número cujo segundo dígito seja (5) é dada por:

P(S5) = P(15) + P(25) + P(35) + P(45) + P(55) + P(65) + P(75) + P(85) + P(95)

Vejamos o que ocorre com P(65) quando aplicamos uma transformação logarítmica:

P(65) = 1/10
P(65) = (66-65)/10
P(65) = 66/10 – 65/10
P(65) = log(66)/log(10) – log(65)/log(10)
P(65) = log(66)/1 – log(65)/1
P(65) = log(66) – log(65)
P(65) = log(66/65)
P(65) = log[(65+1)/65]
P(65) = log(65/65 + 1/65)
P(65) = log(1 + 1/65)

3. Abstração do Padrão

Como observado, há um padrão no tratamento do segundo dígito com o auxílio de log10 e alguns artifícios advindos das propriedades do logaritmo. Esse padrão pode ser expresso no símbolo abaixo:

O desdobramento do símbolo, aplicado à P(S1) e P(S5), permite escrever:

P(S1) = P(11) + P(21) + P(31) + P(41) +
P(51) + P(61) + P(71) + P(81) + P(91)

P(S1) = log(1 + 1/11) + log(1 + 1/21) + log(1 + 1/31) +
log(1 + 1/41) + log(1 + 1/51) + log(1 + 1/61) +
log(1 + 1/71) + log(1 + 1/81) + log(1 + 1/91)

P(S1) = 0,037788561 + 0,020203386 + 0,013788284 +
0,010465434 + 0,008433168 + 0,007061854 +
0,006074148 + 0,005328834 + 0,004746435

P(S1) = 0,113890104

P(S5) = P(15) + P(25) + P(35) + P(45) +
P(55) + P(65) + P(75) + P(85) + P(95)

P(S5) = log(1 + 1/15) + log(1 + 1/25) + log(1 + 1/35) +
log(1 + 1/45) + log(1 + 1/55) + log(1 + 1/65) +
log(1 + 1/75) + log(1 + 1/85) + log(1 + 1/95)

P(S5) = 0,028028724 + 0,017033339 + 0,012234456 +
0,009545318 + 0,007825338 + 0,006630579 +
0,005752329 + 0,005079526 + 0,004547628

P(S5) = 0,096677237

Por fim, as frequência esperadas para cada um dos dígitos são:

P(S0) = 0,1196
P(S1) = 0,1138
P(S2) = 0,1088
P(S3) = 0,1043
P(S4) = 0,1003
P(S5) = 0,0966
P(S6) = 0,0933
P(S7) = 0,0903
P(S8) = 0,0875
P(S9) = 0,0849

A mesma mecânica se aplica à análise do terceiro dígito e assim por diante, mas para essa empreitada, você precisaria de auxílio computacional.

Exemplo 1: A Sequência de Fibonacci

No outro artigo, produzi o gráfico abaixo para comparar o primeiro dígito de cada um dos dos primeiros 1000 números da sequência de Fibonacci com a frequência esperada por Benford:

Como você pode observar, o comportamento de cada dígito está de acordo com o esperado e isso faz sentido, pois estamos tratando de dois fenômenos da natureza decodificados em momentos históricos distintos e que não têm quaisquer relações diretas e que não deveriam se contradizer. Parece até que ambos são efeitos de alguma lei natural mais ampla. Veja agora o comportamento do segundo dígito em relação à Benford:

Perceba que o segundo dígito também concorda com a frequência esperada.

Exemplo 2: Análise de Doações para Campanhas Eleitorais

Depois que li o ótimo livro Rápido e Devagar – Duas Formas de Pensar, de Daniel Kahneman, passei a valorizar mais ainda a necessidade de se ter uma baseline para qualquer coisa que queiramos medir. Foi por isso que primeiro fiz a demonstração contra a sequência de Fibonacci para verificar a aderência de um conjunto numérico à Benford com relação ao primeiro e ao segundo dígitos.

Voltando às doações de campanha do PT, vejamos se podemos enquadrar o partido na Lei do Segundo Dígito. Fiz uma análise sobre 899 registros de doações para a campanha de 2014 ao governo do Estado de São Paulo que estão disponíveis no sistema do TSE. As frequências de aparecimento do primeiro dígito produziram a tabela abaixo:

PRIMEIRO DÍGITO BENFORD (%) PT (%)
1 30,10 34,48
2 17,61 25,58
3 12,49 9,46
4 9,70 4,45
5 7,99 5,23
6 6,70 5,45
7 5,80 6,01
8 5,17 4,00
9 4,58 5,34

À partir da tabela, montei o gráfico abaixo:

Perceba que os primeiros 5 dígitos estão dissonantes com relação à Benford. Uma possível explicação é que os números que começavam com 4 foram alterados para começar com 2, mas como afirmei naquele artigo, seriam necessários mais dados para inferir o que quer que seja. Veja agora o comportamento do segundo dígito:

SEGUNDO DÍGITO BENFORD (%) PT (%)
0 11,96 25,58
1 11,38 10,23
2 10,88 4,78
3 10,43 6,67
4 10,03 4,45
5 9,66 13,90
6 9,33 9,57
7 9,03 8,12
8 8,75 11,57
9 8,49 5,12

Com essa tabela, produzi esse gráfico:

Se o primeiro dígito discorda de Benford, o segundo dígito já não é tão relevante para uma análise, mas mesmo assim note a frequência observada do número (0). Essa inflação pode ser explicada pela mudança manual do segundo dígito (2), (3) e (4) para (0).