A Navalha de Ockham

William de Ockham (1275-1347) foi um filósofo e frade inglês nascido em Ockham, um vilarejo à sudoeste de Londres. Como todo Franciscano, aderiu aos princípios da humildade e da simplicidade, mas também fez voto de pobreza e vivia com o mínimo necessário, o que contrastava com a opulência da Igreja Católica, nascida nos escombros do Império Romano do Ocidente, do qual é herdeira tanto da cultura quanto do projeto de poder e de hegemonia. Mesmo não tendo aplicado o princípio da parcimônia aos artigos da fé, a consequência lógica daquilo que propunha e que explicaremos mais adiante gerou alguns embates com a Igreja e isso culminou com a excomunhão de William pelo Papa João XXII.

Figura 1 – William de Ockham

Seria difícil entender o pensamento de William sem que pelo menos saibamos que seu projeto filosófico seguia a corrente Nominalista. O Nominalismo é uma doutrina que assume uma posição de negação dentro da Metafísica da existência de várias entidades que são tipicamente defendidas por Realistas, como os objetos abstratos e os universais (conceitos ou qualidades que se atribuem a um indivíduo), que segundo William não tinham existência fora da mente. Para os Nominalistas, esses objetos não passavam de ficções mentais utilizadas para explicar o conjunto de singulares que realmente existem. Você verá que essa negação está presente na Navalha de Ockham.

Conceito de Navalha de Ockham

A Navalha de Ockham, termo cunhado por volta de 1850, é uma ferramenta lógica, metodológica e epistemológica que oferece como critério de escolha a simplicidade quando temos que decidir entre duas explicações ou hipóteses para um mesmo problema ou evidência observada. Em outra palavras, se temos duas teorias distintas, ambas adequadas para explicar um mesmo fenômeno, a Navalha indica que devemos escolher a que emprega menos entidades ou pressupostos. Esse princípio operacional – o “corte” – implica uma relação entre a composição de uma explicação e a escolha mais correta. Nas palavras de William de Ockham:

Se temos várias hipóteses igualmente boas para explicar um evento devemos escolher aquela que possui o menor número de premissas

A Navalha não é uma lei que diz o que é verdadeiro e o que é falso. Mesmo que esse princípio seja dependente do ponto de vista e da intuição de quem o aplica, essa subjetividade deve ser minimizada, pois uma vez que essa ferramenta trabalha com regras e não com exceções, seu uso deve ser vinculado a uma base histórica e estatística. Dessa forma, evitamos inclusive o viés da confirmação que tira a isenção de uma escolha. O viés é mais bem caracterizado na frase “exigências extraordinárias exigem provas extraordinárias”. Extraordinário é tudo aquilo que é considerado fora do comum e apenas por ser incomum já é alvo da Navalha quando confrontado com algo considerado comum. Isso pode ser um problema, mas trataremos desse assunto em outro momento.

Para fazermos uma escolha com base na simplicidade, devemos utilizar a chamada razão suficiente para validar nossa verdade. Razão suficiente, corroborando com Ockham, é a observação de um fato, a utilização de uma intuição lógica imediata, uma revelação divina ou uma dedução que utilize esse tipo de razão. A revelação divina foi embutida para amenizar um efeito colateral bastante óbvio do uso da Navalha: Deus é uma hipótese desnecessária – não precisamos postular a existência Dele para explicar a origem de tudo.

É por isso que a Navalha não é aceita pelos crentes. Perceba que mesmo assumindo a existência de um Deus Criador como uma verdade, a Navalha ainda age: o poder desse Deus não precisa ser infinito – basta que seja suficiente – ver paradoxo da onipotência; Ele não precisa ser onisciente – basta saber o necessário para criar o universo; Ele não precisa ser onipresente – basta que esteja presente onde é necessário; Ele não precisa ser infinitamente bom – basta que seja suficientemente justo. Veja como a Navalha faz estrago no cristianismo: é mais simples acreditar que alguém ressuscitou e ascendeu aos céus ou que tudo foi uma mentira inventada por alguém que tinha algum propósito? Agora você entende porque William de Ockham foi excomungado por aqueles que detinham o monopólio da fé?

A verdade sempre será encontrada na simplicidade e não na multiplicidade e confusão das coisas. É a perfeição das obras de Deus que são todas feitas com a maior simplicidade. Ele é o Deus da ordem e não da confusão.

Issac Newton

A perfeição não é alcançada quando já não há mais nada para adicionar, mas quando já não há mais nada que se possa retirar.

Antoine de Saint-Exupéry

Simplicidade é o último grau de sofisticação

Leonardo da Vinci

Tudo deve ser feito da forma mais simples possível, mas não mais simples que isso

Albert Einstein

Menos é mais

Ludwig Mies Van Der Rohe

Napoleão: -Escreveste esta enorme obra sobre os mistérios do universo sem mencionar uma única só vez o nome do Deus, seu edificador?

Laplace: -Senhor! Não senti necessidade desta hipótese.

Diálogo entre Napoleão e Laplace sobre a Transformada de Laplace

Sub-Princípios

1. Princípio da Pluralidade

A multiplicidade de entidades ou de pressupostos não deve ser postulada sem necessidade. Segundo William: “nada deve ser postulado sem uma razão dada, a menos que seja sabido por meio de si mesmo, sabido por meio de experiência ou provado pela autoridade da escritura sagrada”. Ao incluir as escrituras, William tenta excluir Deus de seu princípio minimalista, mas o estrago já estava feito, como explicamos anteriormente;

2. Princípio da Parcimônia

Esse princípio afirma que deve-se economizar recursos – não faz sentido fazer com mais o que pode ser feito com menos. Esse princípio não é contemporâneo de Ockhan – escritos de Aristóteles já o apresentavam em 4 a.C. A própria natureza utiliza esse princípio para evitar o desperdício de energia: um raio segue o menor caminho possível para chegar ao solo e algumas plantas têm folhas adaptadas para minimizar a perda de água. A própria matemática, quando entendida como decodificação da natureza, oferece mecanismos de minimização de recursos, pois, como no exemplo da Galeria de Arte, não faz sentido fazer com muito o que se pode fazer igualmente bem com pouco.

Com esse princípio, podemos compor argumentos com menos premissas: quando a Navalha assume uma identidade metafísica, ela pode ser utilizada para negar a existência de várias das entidades que são postuladas em uma hipótese. Sendo assim, se não precisamos postular a existência de uma entidade para explicar um determinado fenômeno, então não devemos sequer acreditar na existência de tal entidade. Como um princípio metodológico, que é a faceta da Navalha que mais nos interessa, ela nos induz a não postular a existência de entidades sem boas razões.

Validação de um Argumento

Médicos podem utilizar a Navalha para dar um diagnóstico e detetives podem utilizar a simplicidade para excluir teorias que explicam um determinado crime. De forma geral, a Navalha é mais bem utilizada para validação de argumentos.

Se todas as hipóteses de uma teoria 1 estão contidas em uma teoria 2, então a teoria 1 é a mais simples. Exemplo: se a teoria 1 tem as hipótese (H1 e H2) e a teoria 2 tem as hipóteses (H1, H2, H3, H4, H5 e H6), então a teoria 1 será escolhida, pois explica de forma mais simples – com menos pressupostos ou entidades e sem perda explanatória – o mesmo fenômeno observado. É importante observar que a Navalha oferece um critério de escolha racional, mas não serve para provar teorias e hipóteses.

O professor João Carlos, da USP, apresentou um exemplo que corrobora a importância das evidências na confirmação ou refutação de uma teoria. Baseado no exemplo dele, fiz o meu. Considere duas teorias:

T1 = “Todas as tartarugas são terrestres”

T2 = “Todos as tartarugas são marinhas”

As duas teorias se contradizem. Considere a evidência:

E1 = “Uma tartaruga foi avistada em terra”

Ao corroborar com T1, E1 aparentemente refuta T2, mas considere a hipótese abaixo:

H1 = “Uma tartaruga marinha estava botando ovos na praia”

Cada tentativa de refutar T1 pode ser desafiada com novas hipóteses. Porém, a Navalha imediatamente corta T2, uma vez que T1 não necessita da hipótese H1 para explicar E1.

Exemplos de Uso

Escolhi alguns exemplos que demonstram como a ferramenta apresentada encontra uso em nosso cotidiano quando somos confrontados com situações e teorias absurdas.

O Homem Pisou na Lua?

O homem pisou na Lua em 1969? Teóricos da conspiração dizem que tudo foi uma farsa encenada pela NASA com auxílio do FBI e do cineasta Stanley Kubrick. Questionaram a falta de estrelas nas fotos tiradas ao lado do módulo lunar, a posição das sombras, o fato da pegada de Neil Armstrong não se apagar, a bandeira estar tremeluzindo sendo que não há vento na Lua, etc. Os Mithbusters dedicaram um episódio inteiro para explicar cada uma das falácias utilizando ciência e artifícios cinematográficos. Para finalizar e encerrar o caso, eles direcionaram um laser para um ponto da Lua onde uma das missões Apollo deixou um prisma. O raio foi redirecionado para a Terra provando que o Homem esteve na Lua. A explicação mais simples é a de que tudo foi uma farsa ou de que a ciência é capaz de nos levar mais longe? Qual das explicações tem menos pressupostos?

Alienígenas do Passado

Erich von Däniken, com seu livro de estréia Eram os Deuses Astronautas? (The Chariots Of The Gods?) publicado em 1968 e com a série mais recente da qual foi um dos consultores (Alienígenas do Passado), lançou a crença de que o planeta Terra foi visitado no passado por povos de outros planetas. A “teoria” dele apresenta uma série de perguntas que a ciência tem dificuldades para responder como por exemplo: como povos supostamente sem tecnologia eram capazes de mover pedras com algumas dezenas de toneladas? Como eram capazes de cortar pedras com precisão cirúrgica e encaixá-las com perfeição sem deixar folga para passar sequer um fio de cabelo entre elas? Não seria mais simples assumir que esses povos primitivos realmente fizeram todas essas coisas sem influência alienígena?

A Luva do Rogério Ceni

Me lembro de uma vez em que o narrador de futebol da Rede Globo, o Galvão Bueno, começou a teorizar com seus comentaristas o motivo pelo qual o goleiro do São Paulo à época, o Rogério Ceni, fazia gestos para a lateral do campo. Temos várias hipóteses para explicar o problema, cada uma com seus pressupostos:

A. Rogério queria trocar as luvas
B. Rogério queria tomar um café depois do jogo
C. Rogério avisou que retornaria a ligação mais tarde
D. Rogério queria ser substituído porque tem grande apreço pelo goleiro reserva e um dia será um grande técnico de futebol

Veja o viés de confirmação em ação. Os comentarias começaram afirmando – e não achando – que Rogério queria ser substituído pelo goleiro Bosco, por quem, segundo eles, tinha muito carinho e admiração. Enquanto o episódio se encaminhava, narrador e comentaristas começaram a falar sobre o futuro do Rogério no futebol. Argumentaram que ele seria um bom técnico porque se expressava bem e sabia unir a equipe. Escolheram a alternativa (D), mas quando Rogério trocou as luvas (A), o estrago já estava feito. A Navalha apontaria prontamente para a hipótese (A).

Reflexões Sobre os Pontos Fracos do Princípio

Em primeiro lugar, não tente utilizar a Navalha em sistemas de crenças que orientam nossa conduta e nossa vida em sociedade. Como a crença está mais relacionada ao sentimento que à razão, o critério de escolha está mais atrelado ao instinto que à reflexão. Um exemplo é pensar em um capitão de um navio anterior ao período vitoriano que está sendo açoitado por ventos e ondas em uma tempestade. o capitão deve tomar decisões rápidas baseadas basicamente em sua experiência e em seus instintos para salvar seu navio e sua tripulação.

Outro problema em potencial da Navalha é justamente a simplicidade como critério de escolha, o que por si só enviesa a escolha por meio da experiência de quem escolhe – problema da perspectiva. Levando em conta a perspectiva para explicar um fenômeno, é óbvio que um matemático tenderá a dar mais crédito para a explicação que apresentar demonstrações formais, mas para um artista, por exemplo, uma demonstração formal tenderá a ser mais complexa que qualquer outra coisa. Veja, por exemplo, as teorias que explicam a gravidade: Newton e Einstein apresentaram seus modelos gravitacionais, mas a teoria de Einstein, embora mais complexa, possibilitou muitas descobertas e abriu novos campos de estudo. Imagine se Ockham, e não Planck, tivesse recebido a famosa publicação do ano do milagre de Einstein?

Em primeira análise, acreditar que Deus criou o universo pode ser mais simples que acreditar na Teoria do Big Bang e seus efeitos colaterais (a inflação e os multiversos) ou na última teoria de Stephen Hawking, que afirma, baseado na teoria das cordas, que há menos multiversos do que se imaginava e que o universo é finito e, portanto, não é fractal. Porém, acreditar na hipótese do Deus criador pode ser mais complexa, pois temos que explicar a natureza de Deus sem as evidências que a ciência nos dá. Nesse exemplo, a Navalha corta Deus e Hawking escolhendo a teoria clássica da expansão cósmica, mas e se a teoria de Hawking, que é mais complexa, oferecer um caminho para novas descobertas não necessariamente na astronomia? Quem garante que o princípio da simplicidade é universal? Ignorando o que é raro ou mais complexo, a Navalha pode apresentar consequências danosas para a ciência, pois ao confiar na regra excluem-se as exceções.

Referências

1. [https://www.youtube.com/watch?v=i8YESo3eLfE]
2. [https://pt.wikipedia.org/wiki/Navalha_de_Occam]
3. [http://brazil.skepdic.com/occam.html]
4. [https://super.abril.com.br/mundo-estranho/o-que-e-a-navalha-de-occam/]
5. [http://obviousmag.org/cafe_com_paradoxo/2016/a-navalha-cega-de-ockham.html]
6. [https://papodehomem.com.br/navalha-de-ockham-porque-quanto-mais-simples-melhor/]
7. [http://stoa.usp.br/cienciafilosofia/forum/54054.html]
8. [https://maisinteligente.com.br/navalha-de-occam/]
9. [http://www.ppe.uem.br/jeam/anais/2009/pdf/12.pdf]

Anúncios
Categorias:Filosofia

Mapeamento de Tipos Complexos Definidos no JSON com Deserializer do Jackson

O Jackson tem um mecanismo de deserialização simples de utilizar. Se você tem uma representação simples de um campo no JSON que deve ser convertida para um tipo que faça mais sentido para o seu domínio, você pode criar um Module e adicionar a ele o seu próprio Deserializer ou anotar a propriedade que deve ser convertida na classe com @JsonDeserialize. Deserializers ajudam quando o tipo a ser convertido não demanda muita complexidade. Porém, analise o JSON abaixo:

{"funcionarios": [{
  "nome": "ARLINDO",
  "hierarquia1": 
  [
    {
     "nome": "MARIO",
     "hierarquia2": 
     [
      {
        "nome": "JOSE",
        "hierarquia3": 
        [
          {
            "nome": "JOAO"
          },
          {
            "nome": "PEDRO"
          },
          {
            "nome": "MARIA"
          }
        ]
      },
      {
        "nome": "IOLANDA",
        "hierarquia3": 
        [
          {
            "nome": "CARLA"
          },
          {
            "nome": "TADEU"
          },
          {
            "nome": "THIAGO"
          }
        ]
      }
      ]
    },
  {
     "nome": "PAULO",
     "hierarquia2": 
     [
      {
        "nome": "MATEUS",
        "hierarquia3": 
        [
          {
            "nome": "JULIO"
          },
          {
            "nome": "MARTA"
          },
          {
            "nome": "MARCOS"
          }
        ]
      }]
    }]
  },
  {
  "nome": "ADOLDO",
  "hierarquia1": 
  [
    {
     "nome": "FERNADO",
     "hierarquia2": 
     [
      {
        "nome": "AMAURI",
        "hierarquia3": 
        [
          {
            "nome": "RICARDO"
          },
          {
            "nome": "RENATA"
          },
          {
            "nome": "DENIS"
          }
        ]
      }]
    }]
  }
  ]
}

Nesse JSON, note a propriedade “hierarquia{n}”, onde n ∈ N{1,2,3,4,…,n}. Essa propriedade marca o início de uma lista de Funcionários. A classe Funcionario possui uma coleção do mesmo tipo e cada item pode, por sua vez, possuir sua própria coleção e isso se propaga ao “infinito”:

@JsonIgnoreProperties(ignoreUnknown = true)
public class Funcionario {
   private String nome;
   private List<Funcionario> subordinados;
   private Funcionario superior;
   // getters, setter e etc.
}

Uma solução para fazer o mapeamento daquela classe para o JSON é criar um Deserializer mais esperto que utiliza uma expressão regular para identificar a propriedade que marca o início da lista e recursão para fazer o parse das propriedades. Em nosso exemplo, utilizaremos um cliente RESTEasy para invocar um serviço que retorna aquele JSON.

public class FuncionarioDeserializer extends JsonDeserializer<Funcionario> {
	
   private Pattern pattern = Pattern.compile("hierarquia[0-9]+");

   @Override
   public Funcionario deserialize(JsonParser parser, DeserializationContext context)
         throws IOException, JsonProcessingException {
      Funcionario funcionario = new Funcionario();
      parse(parser, context, JsonToken.END_OBJECT, funcionario );
      return funcionario ;
   }

   private void parse(JsonParser parser, DeserializationContext context, 
         JsonToken stop, Funcionario funcionario )
         throws IOException, JsonParseException {
      JsonToken token = parser.nextToken();
      while (token != stop) {
         String fieldName = parser.getCurrentName();
         if (fieldName != null) {
            if ("nome".equalsIgnoreCase(fieldName)) {
               parser.nextToken();
               pessoa.setNome(parser.getText());
            }
            if (funcionario.getSuperior() != null) {
               Funcionario f = new Funcionario();
               f.setSuperior(funcionario.getSuperior());
               funcionario.getSuperior().getSubordinados().add(c);
               parse(parser, context, JsonToken.END_OBJECT, c);
            }
         }
         token = parser.nextToken();
         if (JsonToken.START_OBJECT == token) {
            if (pattern.matcher(nomeCampo).matches()) {
               parser.nextToken();
               Funcionario f = new Funcionario();
               f.setSuperior(funcionario);
               funcionario.getSubordinados().add(f);
               parse(parser, context, JsonToken.END_ARRAY, f);
            }
         }
      }
   }
}

Por fim, vamos cadastrar nosso Deserializer e invocar o webservice de Funcionários:

public List<Funcionario> listar()
   throws Exception {
   ResteasyClient client = new ResteasyClientBuilder().build();
   ResteasyWebTarget target = client.
      target("http://localhost:8080/endpoint").
      path("/funcionario/listar/");
   Response response = 
      target.request(MediaType.APPLICATION_JSON).get();
   String value = response.readEntity(String.class);
   response.close();
   ObjectMapper mapper = new ObjectMapper();
   mapper.enable(SerializationFeature.INDENT_OUTPUT);
   mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
   mapper.enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);
   SimpleModule module = new SimpleModule();
   module.addDeserializer(Funcionario.class, new FuncionarioDeserializer());
   mapper.registerModule(module);
   Map<String, List<Funcuonario>> mapItens = mapper.readValue(value,
      new TypeReference<Map<String, List<Funcionario>>>() {
   });
   return mapItens.get("funcionarios");
}

Referências

1. [https://www.programcreek.com/java-api-examples/?api=com.fasterxml.jackson.databind.type.TypeFactory]
2. [https://www.programcreek.com/java-api-examples/index.php?api=com.fasterxml.jackson.databind.type.SimpleType]
3. [https://www.javatips.net/api/com.fasterxml.jackson.databind.jsondeserializer]
4. [https://stackoverflow.com/questions/18313323/how-do-i-call-the-default-deserializer-from-a-custom-deserializer-in-jackson]
5. [http://www.baeldung.com/jackson-nested-values]
6. [https://www.journaldev.com/2324/jackson-json-java-parser-api-example-tutorial]

Categorias:Programação

Parse de URL com OkHttp

OkHttp é uma ferramenta para tratamento de requests e responses compatíveis com os padrões HTTP e HTTP/2. Nesse artigo, vou tratar brevemente do HttpUrl, uma classe utilizada para compor e decompor URLs. Veja esse exemplo:

   HttpUrl url = new HttpUrl.Builder()
       .scheme("http")
       .host("www.teste.com.br")
       .addPathSegment("rest")
       .addQueryParameter("id", "123")
       .addQueryParameter("categoria", "vendedor")
       .addQueryParameter("uf", "SP")
       .build();

Nesse exemplo, a URL contém vários parâmetros, mas ela é montada de forma clara e elegante. O resultado final é esse:

http://www.teste.com.br/rest?id=123&categoria=master

O código ficaria bem ruim se tentássemos criar essa URL concatenando String. Tendo a URL, poderíamos fazer o parse dela e iterar pelos parâmetros:

HttpUrl url = HttpUrl.parse("http://www.teste.com.br/rest?id=123&categoria=master");
for (int i = 0, size = url.querySize(); i < size; i++) {
  System.out.println(url.queryParameterName(i) + ": " + url.queryParameterValue(i));
}

No exemplo abaixo, faço o parse de uma URL e adiciono à ela todos os parâmetros que vieram da request:

private URL parse(HttpServletRequest request) {
   HttpUrl.Builder builder = HttpUrl.parse(request.getScheme()
      .concat("://")
      .concat("www.teste.com.br/rest/")
      .newBuilder();

   Enumeration<?> enumeration = request.getParameterNames();
   while (enumeration.hasMoreElements()) {
      String parameterName = (String) enumeration.nextElement();
      builder = builder
        .addQueryParameter(parameterName, request.getParameter(parameterName));
   }
   return builder.build().url();
}
Categorias:Programação

Removendo Acentos e Caracteres Especiais no Java

A classe java.text.Normalizer aplica transformações em caracteres Unicode para facilitar ordenações, buscas e outras manipulações que precisemos fazer naqueles caracteres. Veja um exemplo de uso abaixo, que foi inspirado nesse componente utilitário:

public String removerAcentos(String valorAcentuado){
   return Normalizer
          .normalize(valorAcentuado, Normalizer.Form.NFD)
          .replaceAll("[^\\p{ASCII}]", "");
}

Se você ivocar aquele método contra a String abaixo, o resultado deverá ser uma versão sem acentos daquela String:

çÇáéíóúýÁÉÍÓÚÝàèìòùÀÈÌÒÙãõñäëïöüÿÄËÏÖÜÃÕÑâêîôûÂÊÎÔÛ
cCaeiouyAEIOUYaeiouAEIOUaonaeiouyAEIOUAONaeiouAEIOU

Você poderia fazer algo assim também no banco de dados para criar consultas que ignoram os caracteres especiais dos registros armazenados.

Categorias:Programação

Deus, Segundo Spinoza

Há um texto que circula pelas redes sociais faz algum tempo chamado “Deus, segundo Spinoza”. O problema é que, embora muito bonito, o texto não foi escrito por Baruch Spinoza (1632 – 1677). Esse texto, que foi escrito por Francisco Javier Ángel Real, pseudônimo de Anand Dilvar, um palestrante espírita mexicano, está no livro Conversaciones con mi guía, onde é narrada uma conversa com uma entidade sobrenatural. Se Dilvar for um médium, os escritos dele são creditados a terceiros tal como fazia Chico Xavier (1910-2002).

Chico Xavier, dentre muitas outras coisas, psicografou o livro Parnaso de Além-Túmulo, uma coletânea de poesias atribuídas a autores desencarnados. Esse tipo de produção motivou algumas perguntas feitas pela bancada de entrevistadores do famoso programa Pinga Fogo, levado ao ar em 1971 pela extinta TV Tupi. Aquele programa foi um marco para o espiritismo e para a televisão brasileira. Chico, de forma muito perspicaz, respondeu, quando questionado sobre a dificuldade de psicografar Hegel, Kant e outros grandes autores, que “talvez eles também fossem médiuns”. Quando questionado sobre os relatos de psicografia na Igreja Católica, ele respondeu, também de forma muito inteligente, que “um livro é um instrumento de cultura que está entre esse mundo e o outro; o primeiro livro, que era feito de pedra, foi psicografado por Moisés.”

Deus Segundo Spinoza

Pára de ficar rezando e batendo no peito! O que eu quero que faças é que saias pelo mundo e desfrutes de tua vida. Eu quero que gozes, cantes, te divirtas e que desfrutes de tudo o que eu fiz para ti.

Pára de ir a esses templos lúgubres, obscuros e frios que tu mesmo construíste e que acreditas ser a minha casa. Minha casa está nas montanhas, nos bosques, nos rios, nos lagos, nas praias. Aí é onde eu vivo e aí expresso meu amor por ti.

Pára de me culpar da tua vida miserável. Eu nunca te disse que há algo mau em ti ou que eras um pecador, ou que tua sexualidade fosse algo mau. O sexo é um presente que eu te dei e com o qual podes expressar teu amor, teu êxtase, tua alegria. Assim, não me culpes por tudo o que te fizeram crer.

Pára de ficar lendo supostas escrituras sagradas que nada têm a ver comigo. Se não podes me ler num amanhecer, numa paisagem, no olhar de teus amigos, nos olhos de teu filhinho, não me encontrarás em nenhum livro! Confia em mim e deixa de me pedir. Tu vais me dizer como fazer meu trabalho?

Pára de ter tanto medo de mim. Eu não te julgo, nem te critico, nem me irrito, nem te incomodo, nem te castigo. Eu sou puro amor.

Pára de me pedir perdão. Não há nada a perdoar. Se eu te fiz… Eu te enchi de paixões, de limitações, de prazeres, de sentimentos, de necessidades, de incoerências, de livre-arbítrio. Como posso te culpar se respondes a algo que eu pus em ti? Como posso te castigar por seres como és, se eu sou quem te fez? Crês que eu poderia criar um lugar para queimar a todos meus filhos que não se comportem bem, pelo resto da eternidade? Que tipo de Deus pode fazer isso? Esquece qualquer tipo de mandamento, qualquer tipo de lei; essas são artimanhas para te manipular, para te controlar, que só geram culpa em ti.

Respeita teu próximo e não faças o que não queiras para ti. A única coisa que te peço é que prestes atenção a tua vida, que teu estado de alerta seja teu guia. Esta vida não é uma prova, nem um degrau, nem um passo no caminho, nem um ensaio, nem um prelúdio para o paraíso. Esta vida é a única que há aqui e agora, e a única que precisas. Eu te fiz absolutamente livre. Não há prêmios nem castigos. Não há pecados nem virtudes. Ninguém leva um placar. Ninguém leva um registro. Tu és absolutamente livre para fazer da tua vida um céu ou um inferno.

Não te poderia dizer se há algo depois desta vida, mas posso te dar um conselho. Viva como se não o houvesse. Como se esta fosse tua única oportunidade de aproveitar, de amar, de existir. Assim, se não há nada, terás aproveitado da oportunidade que te dei. E se houver, tem certeza que eu não vou te perguntar se foste comportado ou não. Eu vou te perguntar se tu gostaste, se te divertiste… Do que mais gostaste? O que aprendeste?

Pára de crer em mim – crer é supor, adivinhar, imaginar. Eu não quero que acredites em mim. Quero que me sintas em ti. Quero que me sintas em ti quando beijas tua amada, quando agasalhas tua filhinha, quando acaricias teu cachorro, quando tomas banho no mar.

Pára de louvar-me! Que tipo de Deus ególatra tu acreditas que eu seja? Me aborrece que me louvem. Me cansa que agradeçam. Tu te sentes grato? Demonstra-o cuidando de ti, de tua saúde, de tuas relações, do mundo. Te sentes olhado, surpreendido? Expressa tua alegria! Esse é o jeito de me louvar.

Pára de complicar as coisas e de repetir como papagaio o que te ensinaram sobre mim. A única certeza é que tu estás aqui, que estás vivo, e que este mundo está cheio de maravilhas. Para que precisas de mais milagres? Para que tantas explicações? Não me procures fora! Não me acharás. Procura-me dentro de ti… aí é que estou.

Referências

1. [https://douglasur.wordpress.com/2017/09/30/o-texto-deus-segundo-spinoza-nao-e-de-spinoza/]
2. [https://www.heitorfreire.com.br/index.php?option=com_content&view=article&id=230:deus-segundo-spinoza&catid=31:geral&Itemid=41]
3. [http://www.filosofia.com.br/historia_show.php?id=72]

Categorias:Filosofia

Entenda Porque o Logaritmo Natural de Zero é Indefinido

Existe uma explicação bem simples do porquê ln(0) ser indefinido. Vamos transformar ln(0) em sua forma exponencial:

ln(0) = x
loge(0) = x
ex = 0

Não há um número x ao qual e deve ser elevado para que o resultado seja 0. Sendo assim, o melhor que podemos fazer é verificar os limites. O limite de ln(x) quando x se aproxima de 0+ é -∞:

limx→0+ln(x) = -∞

Veja o gráfico da função exponencial em vermelho. Quando o valor no eixo das abscissas se aproxima de zero, o valor correspondente no eixo das ordenadas se aproxima do infinito negativo:

Categorias:Matemática

Como Injetar Parâmetros em Testes Unitários

Testes unitários não devem armazenar estado e podem ser executados infinitas vezes sem que o resultado seja modificado. Às vezes, seu código de teste não fica tão legível se você estiver manipulando todos os parâmetros de entrada e de saída na própria implementação de cada método. Você poderia utilizar um MethodRule, que é uma alteração em como um método roda e se reporta. O interessante é que você poderia ter várias implementações dessa interface interagindo com um método de teste, mas vamos fazer um exemplo que utiliza uma implementação da interface para modificar propriedades do próprio TestCase.

Nesse exemplo, vamos utilizar o Arquillian. Ele não é necessário, mas se ele estiver sendo utilizado, é necessário fazer alguns testes para que a injeção ocorra no momento certo por causa do InitialContext, assim como foi comentado em outro artigo. Primeiro, vamos criar uma classe para verificar se o Arquillian está rodando:

import javax.naming.InitialContext;
import javax.naming.NamingException;

public class ArquillianUtils {
  public static boolean isRunningInContainer() {
    try {
      new InitialContext().lookup("java:comp/env");
      return true;
    } catch (NamingException e) {
      return false;
    }
  }
}

Vamos criar uma anotação que marcará as propriedades que devem ser atualizadas por nossa Rule. Em nossa implementação, o valor informado na anotação será injetado na propriedade anotada. Não julgaremos se essa implementação é boa ou não, mas o exemplo servirá para que você veja a flexibilidade que o JUnit pode te oferecer.

@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.FIELD })
public @interface Parameter {
	String value();
}

Em seguida, vamos implementar nossa MethodRule. Ela será responsável por buscar os campos anotados com Parameter e injetar neles mesmos os valores passados para a anotação:

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import org.jboss.arquillian.container.test.api.Deployment;
import org.junit.rules.MethodRule;
import org.junit.runners.model.FrameworkMethod;
import org.junit.runners.model.Statement;

public class ParameterRule implements MethodRule {
   public ParameterRule() {
   }

   @Override
   public Statement apply(final Statement base, final FrameworkMethod method, final Object target) {
      return new Statement() {
         @Override
         public void evaluate() throws Throwable {
            boolean runInContainer = getDeploymentMethod(target).
               getAnnotation(Deployment.class).testable();
            if (runInContainer) {
               evaluateParametersInContainer(base, target);
            } else {
               evaluateParametersInClient(base, target);
            }
         }
      };
   }

   private Method getDeploymentMethod(Object target) throws NoSuchMethodException {
      Method[] methods = target.getClass().getDeclaredMethods();
      for (Method method : methods) {
         if (method.getAnnotation(Deployment.class) != null){
            return method;
         }
      }
      throw new IllegalStateException("No method with @Deployment annotation found!");
   }

   private void evaluateParametersInContainer(Statement base, Object target) throws Throwable {
      if (ArquillianUtils.isRunningInContainer()) {
         evaluateParamsToTarget(base, target);
      } else {
         ignoreStatementExecution(base);
      }
   }

   private void evaluateParametersInClient(Statement base, Object target) throws Throwable {
      if (ArquillianUtils.isRunningInContainer()) {
         ignoreStatementExecution(base);
      } else {
         evaluateParamsToTarget(base, target);
      }
   }

   private void evaluateParamsToTarget(Statement base, Object target) {
      Field[] allFields = target.getClass().getDeclaredFields();
      for (Field field : allFields) {
         if (field.getAnnotation(Parameter.class) != null) {
            if (!field.isAccessible()) {
               field.setAccessible(true);
            }
            try {
               field.set(target, field.getAnnotation(Parameter.class).value());
               base.evaluate();
            } catch (Throwable e) {
               e.printStackTrace();
            }
         }
      }
   }

   private void ignoreStatementExecution(Statement base) {
      try {
         base.evaluate();
      } catch (Throwable ignored) {
      }
   }
}

E finalmente vamos escrever nosso teste unitário que rodará com o Arquillian para que ganhemos injeção de dependências. Nosso teste tem duas propriedades, param1 e param2, que receberão o conteúdo da anotação Parameter:

@RunWith(Arquillian.class)
public class PessoaTest extends TestCase {

   @Inject
   public PessoaService service;

   @Rule
   public ParameterRule rule = new ParameterRule();

   @Parameter(value = "Primeiro Valor Injetado")
   public String param1;
	
   @Parameter(value = "Segundo Valor Injetado")
   public String param2;

   @Test
   public void testeParam1() throws Exception {
       assertEquals(param1, "Primeiro Valor Injetado");
   }

   @Test
   public void testeParam2() throws Exception {
       assertEquals(param2, "Segundo Valor Injetado");
   }
}
Categorias:Programação