A Arte das Perguntas Poderosas

Se eu tivesse uma hora para resolver um problema e minha vida dependesse da solução, eu gastaria os primeiros 55 minutos determinando qual é a pergunta certa a se fazer. Uma vez que eu saiba qual é a pergunta certa, eu poderia resolver o problema em menos de 5 minutos.

Albert Einstein

Após 7,5 milhões de anos, o pensador profundo calcula a resposta da vida, do universo e tudo mais: 42. Indignados, os seres hiperinteligentes dizem que essa não era a resposta da pergunta. O computador contra-argumenta que eles próprios não sabiam qual era pergunta, afirmando em seguida que a resposta em si, 42, só poderia ser entendida quando descobrissem a pergunta.

Douglas Adams, O Guia do Mochileiro das Galáxias

Sabe aquelas reuniões inúteis nas quais as pessoas ficam horas falando sobre os mais diversos problemas ou fazendo monólogos sobre o nada na terra do nunca, mas no final você termina com a impressão de que o problema principal não foi discutido ou foi apenas citado superficialmente sem que um plano de ação tenha sido definido? Fico com uma sensação muito ruim quando percebo que perdi meu valioso tempo, pois eu poderia estar fazendo qualquer outra coisa que agregasse valor, como estudar uma tecnologia nova ou refatorar alguma coisa, por exemplo. Em The Art of Powerful Questions, um artigo que li faz vários anos, Eric E. Vogt tenta provar que o problema dessas reuniões é que elas falharam em despertar o interesse ou a criatividade das pessoas através da qualidade das perguntas realizadas, pois para ele as boas perguntas têm o objetivo de iniciar diálogos realmente produtivos de onde se nasçam respostas criativas com potencial transformador para a organização.

O autor afirma que temos que encontrar a “pergunta jugular” – aquela pergunta que ataca o problema em sua raiz. James Watson e Francis Crick uma vez perguntaram “como o DNA se pareceria em um formato 3D?”. Esse pergunta levou ao desenvolvimento do modelo de dupla hélice do DNA. Claro que houve muita pesquisa, tentativas e erros, mas o trabalho se iniciou à partir de uma pergunta poderosa que motivou e em seguida direcionou os estudos. De forma análoga, um dia Ray Kroc perguntou “onde posso encontrar um bom hambúrguer na estrada?”. Refletindo sobre essa pergunta, Ray criou o McDonald’s. O hambúrguer do McDonald’s é bom? Depende do que “bom” signifique para você, mas o importante é que uma boa pergunta culminou com a criação de uma das maiores cadeias de fast-food do mundo.

Se perguntas são tão importantes, por que não gastamos mais tempo refletindo sobre elas? Nas organizações é muito comum que gestores adotem uma postura do tipo “resolve logo, pois você é pago para isso e tempo é dinheiro!“. A mensagem transmitida por essa postura é clara: “quero uma resposta e não uma pergunta!”; “eu faço as perguntas!”. Perceba que isso nem é tão estranho assim. O modelo de ensino brasileiro foca na memorização de respostas às mais diversas questões – e na mecânica da resolução no caso particular das exatas – em detrimento do debate sobre o problema original. Debater problemas induz o aluno a pensar com a própria cabeça e encontrar as respostas sozinho. A coisa mais difícil em matemática não é resolver uma continha qualquer, mas sim modelar o problema fazendo as perguntas certas no processo epistemológico para encontrar um símbolo que carregue muita noese. Na verdade, os trabalhadores do conhecimento, outrora alunos questionadores, gastam mais tempo pensando em perguntas mais profundas do que se preocupando em tomar decisões imediatas quando um problema se apresenta. Pessoas treinadas apenas para responder ficam presas aos níveis operacionais mais baixos das empresas.

Einstein disse que “os problemas que nós tivermos não podem ser resolvidos no mesmo nível de pensamento que os criou”. Ou seja, para atacar um problema devemos mudar o foco para a solução. Corroborando com a proposta do autor daquele artigo, uma solução nasce da resposta de uma pergunta poderosa. Boas perguntas são as chaves para mudanças em larga escala.

A Arquitetura das Perguntas Poderosas

O importante é nunca parar de questionar.

Albert Einstein

No artigo The Art and Architeture of Powerful Questions, Eric E. Vogt revisita seu artigo The Art of Powerful Questions para clarificar o que faz uma pergunta ser realmente poderosa. A palavra “poderosa” traz um nível de subjetividade muito alto. É necessário dissecar os elementos que a constituem para entendermos a extensão do seu poder. Físicos ganhadores de prêmios Nobel, como o próprio Einstein, atribuíam suas descobertas científicas à capacidade de fazerem as perguntas certas. Por que Einstein nos convida a nunca parar de questionar?

  1. Perguntas são pré-requisitos para o aprendizado
  2. Perguntas são janelas para a criatividade e para a inspiração
  3. Perguntas estimulam o pensamento
  4. Perguntas desafiam pressupostos ultrapassados
  5. Perguntas nos conduzem ao futuro

Para Vogt, perguntas poderosas:

  1. Estimulam o pensamento reflexivo
  2. Desafiam pressupostos
  3. Provocam pensamentos
  4. Geram energia e direcionam a exploração
  5. Tocam um significa profundo
  6. Provocam mais questionamentos

Em The Surprising Power of Questions, Leslie K. John e Alison W. Brooks parecem ter bebido da mesma fonte de Eric E. Vogt, mas elas não se preocuparam com a estrutura de uma boa pergunta. O artigo delas foca nos impactos organizacionais sob o aspecto da inteligência emocional, um tema estudado e aplicado faz anos. Porém, Vogt está mais preocupado com a estrutura das perguntas. A arquitetura linguística das perguntas poderosas pode ser expressa no seguinte arranjo hierárquico:

Agora, reflita sobre essas perguntas:

  • Você está resfriado?
  • Quem nasceu primeiro, o ovo ou a galinha?
  • Como se forma o arco-íris?
  • Por quê o Brasil não vai para a frente?

Quando nos movemos de perguntas cuja resposta seja um simples “sim” ou “não” para uma pergunta do tipo “por quê”, as perguntas necessitam de mais reflexão do receptor para serem respondidas e, dessa forma, são consideradas mais poderosas. A primeira pergunta, sobre o resfriado, pode ser respondida com um simples “sim” ou “não”. Porém, a pergunta sobre o Brasil implica uma análise histórica, cultural, social, política, econômica e sabe-se lá mais o quê. Veja essas outras duas perguntas:

  • Por quê meu sapato está desamarrado?
  • Como se constrói uma casa?

Nesse caso, a pergunta feita com “como” parece ser mais poderosa que a pergunta feita com o “por quê”. Isso significa que devemos considerar outros elementos na pergunta além de sua arquitetura para aumentar seu poder. Sendo assim, o autor partiu da hipótese de que há três elementos que devem ser considerados ao formular uma pergunta: arquitetura, escopo e significado/contexto.

O escopo da pergunta determina sua extensão. Note a abrangência das perguntas abaixo e como elas demandarão maior reflexão antes das respostas:

  • Como devemos cuidar de nosso jardim?
  • Como devemos cuidar de todas as árvores de nosso planeta?

O significado/contexto era tratado no primeiro artigo do autor (The Art of Powerful Questions) como suposição ou hipótese, mas aparentemente esses termos eram muito vagos. Uma pergunta poderosa em termos de significado/contexto tem as seguintes características:

  1. Desafiam pressupostos
  2. Geram energia e direcionam a exploração
  3. Tocam um significa profundo

Considere as perguntas abaixo:

  • Como podemos competir com o outro departamento?
  • Como podemos colaborar com o outro departamento?

Note que o caráter positivo da segunda pergunta mudou seu significado e como consequência é capaz de gerar um novo conjunto de perguntas e produzir respostas mais interessantes.

O autor traz mais um elemento que trabalha em conjunto com os outros três: o impacto. Perguntas produzem um dos quatro impactos abaixo:

Criar – Reforçar – Alterar – Destruir

Ele quis dizer que perguntas podem, por exemplo, ter como efeito colateral a destruição de algum preconceito e a criação de novos pressupostos. Para finalizar, o autor nos convida a produzir algumas perguntas e modificá-las começando pela arquitetura (onde?, como?, etc), abrindo ou fechando o escopo e trabalhando o significado/contexto com vistas aos impactos produzidos.

Referências

1. [http://umanitoba.ca/admin/human_resources/change/media/the-art-of-powerful-questions.pdf]
2. [http://www.javeriana.edu.co/decisiones/PowerfulQuestions.PDF]
3. [https://pt.slideshare.net/MarkGillow/the-art-of-questions]

Anúncios
Categorias:Atitude

Criptografia Simétrica com Cipher

O Cipher oferece métodos de criptografia para encriptação e decriptação. Essa classe faz parte do core do JCE (Java Cryptographic Extension). Para utilizar criptografia AES, você deve atualizar a política de jurisdição do JCE de acordo com a sua versão do Java. Como você verá no exemplo abaixo, o digest é apenas uma parte do processo de criptografia.

import java.io.UnsupportedEncodingException;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.Key;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.spec.AlgorithmParameterSpec;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import javax.xml.bind.DatatypeConverter;

public class SimpleCipher {
   public String encrypt(String value, String key) 
      throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, 
             InvalidAlgorithmParameterException, IllegalBlockSizeException, 
             BadPaddingException, UnsupportedEncodingException {
      Cipher cipher = config(Cipher.ENCRYPT_MODE, key);
      byte[] encryptedResult = cipher.doFinal(value.getBytes());
      return DatatypeConverter.printBase64Binary(encryptedResult);
   }

   public String decrypt(String value, String key) 
      throws InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException,
             InvalidAlgorithmParameterException, IllegalBlockSizeException,
             BadPaddingException, UnsupportedEncodingException {
      Cipher cipher = config(Cipher.DECRYPT_MODE, key);
      byte[] decryptedResult = cipher.doFinal(DatatypeConverter.parseBase64Binary(value));
      return new String(decryptedResult);
   }

   private Cipher config(int cipherMode, String key) 
      throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException,
             InvalidAlgorithmParameterException, UnsupportedEncodingException {
      Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
      cipher.init(cipherMode, createKey(key), createIv());
      return cipher;
   }

   private Key createKey(String key)
      throws NoSuchAlgorithmException, UnsupportedEncodingException {
      MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");
      byte[] secretKey = messageDigest.digest(key.getBytes("UTF-8"));
      return new SecretKeySpec(secretKey, "AES");
   }
	
   private AlgorithmParameterSpec createIv() throws UnsupportedEncodingException {
      return new IvParameterSpec("0000000000000000".getBytes("UTF-8"));
   }
}

O teste abaixo valida a implementação exposta:

import org.junit.Assert;
import org.junit.Test;
public class SimpleCipherTest {
   @Test
   public void testeEncryptDecryptParametros() throws Exception{
      SimpleCipher cipher = new SimpleCipher();
      String encrypt = cipher.encrypt("Um simples teste", "123456");
      String decrypt = cipher.decrypt(encrypt, "123456");
      Assert.assertEquals("FALHOU", "Um simples teste", decrypt);
   }
}

Utilizei o OpenSSL para reproduzir o mesmo efeito produzido pelo código java, mas o resultado gerado é diferente:

$echo -n "Um simples teste" | openssl enc -A -aes-256-cbc 
-base64 -K "123456" -iv "0000000000000000"

A explicação é que AES/ECB/PKCS5Padding não é o mesmo que aes-256-cbc. Se a chave gerada no java tiver apenas 16 bytes, deveremos utilizar o algoritmo aes-128-ecb do OpenSSL.

Referências

1. [https://stackoverflow.com/questions/7615743/java-aes-without-padding]
2. [https://pt.stackoverflow.com/questions/145385/como-usar-o-metodo-de-encripta%C3%A7%C3%A3o-openssl-encrypt]
3. [https://docs.oracle.com/javase/8/docs/technotes/guides/security/SunProviders.html]
4. [https://github.com/EliteAndroidApps/WhatsApp-Crypt12-Decrypter/issues/3]
5. [https://stackoverflow.com/questions/23597984/aes-256-encryption-issue]
6. [https://8gwifi.org/CipherFunctions.jsp]
7. [https://stackoverflow.com/questions/32018672/encrypt-using-openssl-in-the-same-way-java-does]

Os Donos do Software

Como tratei no artigo Carregando a Bandeira da Argentina e não tão explicitamente no artigo Desenvolvendo Pastel e Fritando Software, quando produzo esse tipo de texto, não escrevo visando atingir uma determinada empresa ou pessoa. Na verdade, as empresas onde trabalhei, as pessoas com as quais convivi, as situações que vivenciei e como as enfrentei me tornaram uma pessoa mais madura, ponderada e equilibrada e sou muito grato a tudo e a todos. O que escrevo é o resultado de tudo que leio e assisto por aí, mas com uma pitada de experiências pessoais, duas colheres de chá de cultura geral e sarcasmo à gosto. Com esse esclarecimento, sigamos com mais um artigo que pode até se tornar polêmico.

Clientes externos são aqueles que compram os produtos ou consomem os serviços que uma empresa produz. Como captá-los e como fidelizá-los são os segredos do sucesso de uma empresa que quer se manter relevante por muito tempo. Clientes internos ou corporativos, que formam o tal do capital humano, fazem parte do nosso cotidiano no ambiente de trabalho e são aqueles que demandam a criação ou a customização de softwares para consumo da empresa como um todo ou para automatizar um processo de alguma área organizacional. Quando se fala em necessidades de RH, financeiras ou de Estoque, é bem provável que um ERP (Enterprise Resource Planning), um CMS (Content Management System) ou até mesmo uma planilha eletrônica mais bem elaborada possam atender às necessidades apresentadas, pois tratam-se de áreas que em geral possuem problemas bem conhecidos, com poucas nuances, em toda empresa.

É natural que empresas que atuam em determinados seguimentos necessitem da manutenção permanente de equipes de desenvolvimento de software, como e-commerces, por exemplo. Faz sentido que esses profissionais, normalmente funcionários da própria empresa, sejam alocados para produzir algo que auxilie outras áreas da empresa a atingirem seu objetivos, pois, teoricamente, é mais barato utilizar os recursos que já temos para desenvolver algo que precisamos. É a aí que começam os problemas.

“Tive uma grande ideia. Faz aí!” “Qual a dificuldade de colocar um botão ali?” “Não é só apontar?”. A maior parte do quadro empresarial não faz a mais pálida ideia do que é desenvolver software e do que é necessário para que uma ideia se materialize e um processo se desmaterialize. Isso explica porque muita gente não aceita os prazos informados pelos técnicos, que em alguns lugares são tratados até como moleques folgados embora alguns já tenham até atingido a meia idade. Se seu médico dissesse que você tem um câncer maligno e que deveria começar a fazer quimioterapia, você provavelmente concordará. No máximo, procurará uma segunda opinião de um outro médico e não do seu amigo de balada e nem do fanático religioso mais próximo. Se um engenheiro dissesse que será necessário reforçar as colunas e as vigas para que a laje comporte o peso extra, você provavelmente aceitará. É melhor confiar no engenheiro ou na sua intuição? Por que então não se confia nos profissionais de desenvolvimento de software? Nossa formação não é tão demorada quanto a de um médico ou a de um advogado, mas também necessitamos assimilar os conhecimentos necessários para nos capacitarmos e adquirir as habilidades para nos destacarmos. Tal como os médicos, também operamos pacientes ainda vivos, em estado terminal e às vezes sangrando e gritando. Tal como os engenheiros, reforçamos nossos modelos para comportarem novas funcionalidades e aumentamos um parque de máquinas para distribuir o peso do processamento. O que importa se temos a possibilidade de começar a construir uma casa pelo telhado? Toda profissão tem suas peculiaridades.

Áreas, vamos dizer assim, mais “humanas” da empresa tendem a tratar os desenvolvedores de software de um outro setor como seus próprios funcionários. Essas áreas acreditam ou para elas é vendida a possibilidade da criação de um software que é praticamente como água se o processo for como um copo: o software se adaptará perfeitamente e preencherá até os recantos mais escuros e insondáveis de um processo. Não importa se um dia o copo será trocado por uma jarra ou se a água será trocada por urina, pois o software, do jeito que está, já estará preparado para atender uma vez que, é óbvio, o desenvolvedor pegou o DeLorean, deu um pulo lá no futuro para ver como as necessidades evoluiriam, e já deixou tudo pronto. Quando se cria um software para um departamento da sua empresa, digamos, o RH, esse software passa a ser tratado como um ativo daquela área. Isso faz sentido, pois a solução foi customizada para as necessidades daquele departamento naquele momento. A choradeira começa quando a área “dona” do software quer expandir seu uso e descobre que o sistema foi concebido para resolver apenas uma necessidade pontual. Já citei em vários artigos o aviso que o Scott W. Ambler deu para quem projeta demais.

A relação entre uma empresa que desenvolve softwares e os clientes externos normalmente é regida por contratos onde estão previstos os deveres de cada parte, multas e etc. No pior caso, contratos servem para cortar as asas dos clientes externos. Porém, os clientes internos convivem com você e a convivência é cheia de informalidades supondo que você não trabalha em um quartel militar. Você é obrigado a olhar na cara deles quase todo dia e em qualquer conversa informal, no café, surge o assunto do sistema e daquela funcionalidade marota. A conversa pode tomar esse rumo por um ardil bem planejado do cliente. Vez ou outra, vem uma carteirada de cima e você é obrigado a fazer uma cirurgia para implantar um terceiro braço e um terceiro (ou o quarto?) olho naquele software. Com o tempo, o sistema se torna uma Quimera e toda manutenção vai se tornando cada vez mais difícil, arriscada e você perde a vontade de trabalhar naquilo.

E aquele conto do vigário de alterar todo o frontend sem mexer no backend? Há uma espécie de acoplamento de intrincamento funcional e não funcional entre o que o sistema faz, como ele faz e como ele se apresenta. A analogia que faço é a seguinte: se você colocasse a carroceria de uma Ferrari em um Fusca, você teria uma Ferrari, um Fusca, um “ferrafusca” ou um “fuscaferrado”? Provavelmente teria uma “Xinforimpola”. Se você arrancasse a pele de um chimpanzé e a implantasse em um cachorro, o cachorro adquiriria a capacidade de subir em árvores e começaria a apreciar bananas? “Vestir” um software para uma dada ocasião não é tão simples. Cores, formas e determinados comportamentos também comunicam algo diferenciado. As cores dos ícones, por exemplo, carregam em si mesmas significados: um ícone que indica warning normalmente é amarelo, mas se o skin tem cinquenta tons de amarelo para expressar as preferências do cliente e/ou as cores da empresa dele, o propósito daquele ícone pode não ser atingido.

Como evitar ataque de choradeira que se converte em funcionalidade ridícula e software ruim? Uma vez que você escolheu ser funcionário de alguém, deve aceitar muita coisa que não concorda. Em uma empresa não existem clientes internos, mas sim donos de software que tratam os desenvolvedores de software como seus próprios subordinados e às vezes até os forçam a seguir os processos da área do dono. Isso se agrava quando esses donos são pessoas mau informadas, mau formadas e mau contratadas que se acham no direito de interferir nas minúcias daquilo que você faz e até em como faz, pois afinal eles são seus “patrões”. Cliente você escolhe, mas dono de software você trata fisiologicamente: engole, digere e além.

Caverna do Dragão: Requiem

Você cuja infância se deu entre o final dos anos 80 e começo dos 90 assistia ao famoso desenho Caverna do Dragão na Rede Globo. Tenho certeza de que você tem um episódio favorito – o meu era O Cemitério dos Dragões. Também tenho certeza de que você ficou frustado por não haver um episódio final, mas havia sim:

Após um acidente na montanha russa de um parque de diversões, seis garotos morreram e foram para o inferno. Lá no inferno, eles enfrentavam o ‘malvado’ Vingador e o ‘bondoso’ e ‘simpático’ Mestre dos Magos, que na verdade eram a mesma pessoa que estaria apenas se divertindo com o sofrimento dos garotos. A unicórnio Uni é um demônio encarregado de impedir que os jovens consigam sair do inferno e o dragão Tiamat é um anjo que tentava ajudá-los e alertá-los do verdadeiro inimigo, que era o próprio Mestre dos Magos.

Estranho, não? O fato de não ter um episódio de encerramento motivou a proliferação de boatos sobre um possível fim, como esse que resumi acima e que populou a imaginação de muitos fãs do desenho durante os anos 90. Na verdade, existe o roteiro de um episódio final oficial chamado Réquiem que foi escrito por Michael Reaves, mas nunca foi gravado. Em uma entrevista, ele explicou os motivos do cancelamento da série e também que originalmente ele queria que o episódio se chamasse Redemption, mas esse nome foi recusado pelos produtores porque, segundo eles, “daria muito na cara” os rumos que o desenho tomaria se decidissem continuá-lo.

O roteiro dublado do Réquiem pode ser encontrado aqui e a versão original em inglês pode ser encontrada nesse outro link. Depois de ler algumas vezes esse roteiro, percebi uma certa conexão com meu episódio favorito, O Cemitério dos Dragões. É como se as reações e decisões dos garotos nesse episódio fossem o tom daquilo que iriam acontecer no Réquiem. Segue um breve resumo do Réquiem:

Em uma platô elevado, o Vingador e o Mestre dos Magos conversavam de forma enigmática. O Vingador propôs ao Mestre que os garotos fossem submetidos a um teste de coragem e o Mestre aceitou. Enquanto os garotos enfrentavam uma hidra, o Mestre dos Magos aparece e se recusa a ajudá-los. Ainda atordoados pela atitude do seu “guia”, o Vingador surge e propõe um desafio: encontrar uma determinada chave e jogá-la em um abismo. Se bem sucedidos, os garotos poderiam voltar para casa, mas a proposta divide o grupo em dois: de um lado Presto e Sheila liderados por Eric aceitam a proposta do antigo inimigo e partem para procurar a chave; de outro lado, Diana, Bobby e Uni liderados por Hank tomam outro rumo. Após um incidente que quase tira a vida do grupo de Eric, os garotos se unem novamente para procurar a chave. Eles encontram a chave em um sarcófago que continha uma imagem em alto-relevo de um cavaleiro. Ao invés de atirar a chave no abismo, Eric a utiliza em uma fechadura existente na lateral do sarcófago, o que libera uma força que domina o Vingador e o transforma naquela imagem do cavaleiro esculpido na tampa do sarcófago. O Vingador revela ser o filho do Mestre dos Magos, Kyllan, e diversos portais se abrem pelo reino. Esses portais levam à terra natal de cada criatura outrora escrava do Vingador, como os orcs e os homens lagarto. O Mestre dos Magos agradece aos garotos por terem lhe devolvido seu filho e abre um portal para o parque de diversões. A aventura termina com os garotos observando a própria terra natal através do portal. Cabia a eles a decisão de atravessar o portal para voltar às suas vidas normais ou permanecer no Reino e viver novas aventuras.

O professor de desenho e ilustrador Reinaldo Rocha adaptou o roteiro em uma HQ que ficou bem legal. Ele contou um pouco dessa experiência em uma entrevista que concedeu ao blog Urucum Digital. Confira algumas imagens:

Referências

1. [http://web.archive.org/web/20111210052704/http://michaelreaves.com/requiem_preface.htm]
2. [http://web.archive.org/web/20111108004338/http://www.michaelreaves.com/pdf/requiem_sec.pdf]
3. [http://vitorvictor.com//Urucum%20Digital/requiem.pdf]
4. [http://www.rio.matrix.com.br/wagnerrj/caverna-do-dragao-resumo.htm]
5. [https://zupi.co/requiem-o-final-de-caverna-do-dragao/]
6. [http://crossoverpg.blogspot.com.br/p/caverna-do-dragao-requiem.html]

Categorias:Geral

Customizando o Componente DocumentViewer para Apresentar Documentos PDF

O DocumentViewer é um componente do Primefaces Extensions que encapsula o PDF.js, um script que renderiza arquivos PDF no navegador.

Encontrei esse componente durante minhas pesquisas sobre a conversão de arquivos PDF para imagens. Depois que fiz alguns testes com ele, achei o resultado bem satisfatório, pois além de manter a qualidade do arquivo original, ele permite várias ações sobre o arquivo visualizado que poderiam ser customizadas via javascript – no meu caso, era necessário remover principalmente as ações de download, impressão e uma forma de impedir que o usuário copiasse com o mouse o conteúdo apresentado. Coloquei o componente dentro de uma dialog:

<html xmlns="http://www.w3.org/1999/xhtml"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:p="http://primefaces.org/ui"
	xmlns:pe="http://primefaces.org/ui/extensions">
(...)
 <p:dialog height="100%" width="100%" resizable="false" 
   draggable="false" showHeader="false" modal="true">
   <f:view contentType="text/html" locale="pt_BR" >
      <pe:documentViewer id="viewer" zoom="page-width" height="500" locale="pt_BR" 
         value="#{visualizadorMB.content}" download="arquivo.pdf" cache="false"/>
   </f:view>
   <p:remoteCommand oncomplete="block();" autoRun="true" />
 </p:dialog>
(...)
</html>

Nessa versão simplificada do ManagedBean, carreguei o arquivo em um StreamedContent. Lá no XHTML, utilizei um remoteCommand para chamar o javascript, mas como não havia garantias de que os componentes que eu iria esconder já estavam visíveis, utilizei a função timeout do Javascript. Realmente tive problemas no Google Chrome, pois algumas vezes os botões de impressão, download e outros ficavam visíveis na dialog:

@ManagedBean 
public class VisualizadorMB{
   private StreamedContent content;
   public ViewerMB() {
      try {
         File file = new File("{PATH_TO_FILE}");
         FileInputStream in = new FileInputStream(file);
         content = new DefaultStreamedContent(in);
      } catch (Exception e) {
           e.printStackTrace();
      }
   }
}

Agora entra a parte que comentei sobre a customização do componente com Javascript. Basicamente, escondi botões e removi listeners à partir de um jQuery.fn.extend.

$(document).ready(function() {
	jQuery.fn.extend({
		disableCopy : function() {
			return this.each(function() {
				this.onkeydown = function(event) {
					if (event == undefined) {
						event = window.event;
					}
					if (event.ctrlKey
							&& (event.keyCode == 65 || event.keyCode == 67 || event.keyCode == 96 
									|| event.keyCode == 97 || event.keyCode == 80 || event.keyCode == 83)) {
						event.preventDefault();
						event.stopPropagation();
					}
				};
			});
		}
	});
   $(this).disableCopy();
}

A segunda parte do script atua especificamente no iframe criado pelo componente.

function block(){
    var acao = function () {
    	$( "iframe" ).each(function( index ) {
    		jQuery.fn.extend({
    			disableSelection : function() {
    				return this.each(function() {
    					this.onselectstart = function() {
    						return false;
    					};
    					this.unselectable = "on";
    					jQuery(this).css('user-select', 'none');
    					jQuery(this).css('-o-user-select', 'none');
    					jQuery(this).css('-moz-user-select', 'none');
    					jQuery(this).css('-khtml-user-select', 'none');
    					jQuery(this).css('-webkit-user-select', 'none');
    				});
    			},
    			//https://stackoverflow.com/questions/9251837/how-to-remove-all-listeners-in-an-element
    			disableClick : function() {
    				return this.each(function() {
    					this.style.display = "none";
    					var old_element = this;
    					var new_element = old_element.cloneNode(true);
    					old_element.parentNode.replaceChild(new_element, old_element);
    				});
    			},
    			disableSelectedAll : function() {
    				return this.each(function() {
    					this.onkeydown = function(event) {
    						if (event == undefined) {
    							event = window.event;
    						}
    						//https://css-tricks.com/snippets/javascript/javascript-keycodes/
    						//CTRL = keyCode = 17, ou event.ctrlKey = 'true'
    						//CTRL + 'a' = 65
    						//CTRL + 'c' = 67
    						//CTRL + 'p' = 80
    						//CTRL + 's' = 83
    						//CTRL + 'numpad0' = 96
    						//CTRL + 'numpad1' = 97
    						if (event.ctrlKey
    								&& (event.keyCode == 65 || event.keyCode == 67 || event.keyCode == 96 
    										|| event.keyCode == 97 || event.keyCode == 80 || event.keyCode == 83)) {
    							event.preventDefault();
    							event.stopPropagation();
    							/*
    							 * O Chrome nao permite desabilitar o atalho da impressao
    							 * 
    							 * @see https://stackoverflow.com/questions/30331771/disable-print-preview-in-chrome
    							 */
    						}
    					};
    				});
    			}
    		});
    		var id = $( this ).attr('id');
    		// Pode haver outros iframes na tela que nao sao o visualizador de PDF
    		if(id.search("pdfViewer") != -1) {
    			//var iframe = document.getElementById($('[id$=pdfViewer]').attr('id'));
    			var iframe = document.getElementById(id);
    			if(iframe){
    				$('#toolbarViewerRight', iframe.contentWindow.document).disableClick();
    				$('#viewFind', iframe.contentWindow.document).disableClick();
    				$('#toolbarSidebar', iframe.contentWindow.document).disableClick();
    				
    				iframe.contentWindow.document.oncontextmenu = function(){return false;};

    				$(iframe.contentWindow.document).disableSelection();
    				$(iframe.contentWindow.document).disableSelectedAll();
    				$('#viewerContainer', iframe.contentWindow.document).disableSelectedAll();
    				$('#viewer', iframe.contentWindow.document).disableSelectedAll();
    			}
    		}
    		blockPDFViewer();
    	}); 
    };
    setTimeout(acao, 200);
}

Esse foi o máximo que consegui restringir das ações do usuário. O atalho de impressão, [CTRL]+[P], não pode ser bloqueado no Google Chrome. Nesse fórum, explicaram que o Google e outros fabricantes, privilegiando uma experiência consistente do usuário, impedem que os programadores intervenham em certos comportamentos das páginas. Mesmo assim, pense só: é impossível bloquear todas as ações de cópia programaticamente. Um antigo colega me disse que “quanto mais espertos tentamos ser, mais burros ficamos”. Um antigo chefe disse que “independente de você tirar o cérebro e colocar do lado para tentar enxergar as coisas do ponto de vista do usuário, ele sempre será capaz de fazer coisas que você não previu”. Sendo assim, pense comigo: como o conteúdo de uma página web pode ser copiado por um usuário? O usuário sempre pode salvar e imprimir a página inteira, utilizando os menus da barra de ferramentas do navegador, pode instalar plugins no navegador que permitam baixar o conteúdo no formato desejado, pode copiar o conteúdo com ferramentas de depuração do próprio navegador e reconstruir o documento inteiro ou simplesmente pode fotografar a tela com seu celular.

Categorias:Programação

Criptografia Assimétrica com OpenSSL

O OpenSSL é um projeto open source que ajuda a aumentar a segurança na comunicação entre aplicações e garante a autenticidade da identidade de uma das partes comunicantes. Em outro artigo, mostrei como gerar um arquivo p7b. Nesse artigo, vou mostrar como utilizar o OpenSSL para trabalhar com chaves públicas e privadas (criptografia assimétrica).

Criação das Chaves

Vamos utilizar o algoritmo RSA para gerar a chave privada:

$openssl genrsa -out privkey.kp 2048

Esse comando produziu um arquivo chamado privkey.kp cujo conteúdo é:

—–BEGIN RSA PRIVATE KEY—–
MIIEpQIBAAKCAQEA0s2xwy0/awWsYBSTWV+C4MwgBgGw3lj6WiLiXD6oRdhVgEFQ
2PjUJPF0r90McWXmFvVyTlQIFqATtsI7XeMxaI8mecHZpaZWkuWwn9P5Y/oaEfnd
SwzdpugY1yveho39PBKBipuypcPhPEee/fHTeoQiua4FXiCUWhKMSqGBWN830sOw
fZwzKVw5N0JS0HFjiB/PO8TTy5hJ2p+Wb6S2uUwQdo8fwvvD1hNeJiJVH22s+fDh
mG9PDMpOrzXpRkiC9YzzXTRZwOn6oRtXTKIF5LdvpxwKSi641Yl2yCnUW7A7V9zY
UVIOh4m9blP+XGJvW22+l3dAd7gfyXyxZB0v9QIDAQABAoIBADhG4aYRdlTD9vjP
hWbesLoCxKnV2boCVxOpLHUj5RiAYJMU3NiP1VLngxdQE/pSEdMfQ5zVojMoGRs5
T1AJTy9yx/rJXalzdrlQyI5isLmYE02pPwLCNIpSfA81jvqs/WYEKsEuP8sxN/g3
xqJU5PhYPk0DwDsYx4IkYX+rDjUDJmKc6A35LRlCFrBOn46ABW7s5SZYm2dvJqY8
5DJYK1j/jmpO52Ua0nnL/jVxXtwZA/2Y83D34XxHVEaIekG9uKGL0xdoovNEfblB
by2b4A6TT3fkhwlZskAE/b4nX/udWvvkPtVWwTXqZqutdBGKy8MY7hggog4lmt0C
e1CkCQECgYEA8wE2vL2SjQfmDBHM9ipeChWGiObNPq2jIbcrzPAZz5PQJRR892oU
rzgiVwYam4bzj9WYvKVsOLAud3cMiDzmFJ+0MJSbj+vEv5zxuzCqLuURbde8eGth
NMf+I3vkhBp6Vp+T9mnnKDIkbqH3zwvu7Q6z2Rkjidjn0YEbpbSoNMkCgYEA3hOj
gTpXrg4K1l+Opdm0AkHAqaoZYshaUhUepvpjBVRheToTxX5x6g7sHIZ1saxC3Mgm
Q3j95qjMwwAFyF0ySVtIexkxgtcGyBnUgRVeTCKZRtNpawn8SQgruVL8LmHKdQfk
wqCEcGP5jL+oZDzrab+5D0RJQ3Stwnr8X5GAE80CgYEA35NJUkO0ty8COC6UfhQi
63I8km6PfdBx285UbTym8rXTdpowE8608zVZWunRxzBVnQtveHlWZZ2rUtzkWeB1
65m4Rk4kBjlsjsMOISS4H2dALuijjcN17wLmTq1pZSWbU2GE190+AVyI6oT4o7Ue
AVtamy6m5Of8+WOpFT9u1wkCgYEA3A3Bus/BCivH+Vx+0UDD6miVLIns1cGKHkPn
N7ZsYF+YprMx3ETLRA69UBa8kO4M4xFBOSKvFNy26ZMgJ8aRibb2P2Rbdzby9V0D
AVXXNsIh99iNYQ9n+kYqbV0ZniwwnX7Q4zqDgYrPQPS5O3pSG1trWQFlR35an5eW
dGyM6RECgYEA0NoXZz+u6kpcqvB2cH/8g3HmZ8Q8qCQnnn4SZM19XuyUQUkXv0wa
g+nqhWDNFygTcSiWbw3lk/07QRVXvuxOJbGr9CuLA+F0d06wcqEdlKCnZ/Vq0SGV
skwwsPsG8xdUGyX2Bg5mPM5X5NVEamR4oSrlTj0iTPMwLhMeUWVO1s0=
—–END RSA PRIVATE KEY—–

À partir da chave privada criada, criaremos uma chave pública. Lembre-se de armazenar a chave privada, pois ela não pode ser compartilhada. Nos certificados digitais, a chaves privada, dependendo do tipo do certificado, é gerada dentro de um dispositivo criptográfico entregue ao solicitante e a chave pública é armazenada em um hardware mantido pela Autoridade Certificadora. Esses são alguns dos conceitos da Infraestrutura de Chaves Públicas.

$openssl rsa -in privkey.kp -pubout -out pubkey.kp

Esse comando produziu um arquivo chamado pubkey.kp cujo conteúdo é:

—–BEGIN PUBLIC KEY—–
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0s2xwy0/awWsYBSTWV+C
4MwgBgGw3lj6WiLiXD6oRdhVgEFQ2PjUJPF0r90McWXmFvVyTlQIFqATtsI7XeMx
aI8mecHZpaZWkuWwn9P5Y/oaEfndSwzdpugY1yveho39PBKBipuypcPhPEee/fHT
eoQiua4FXiCUWhKMSqGBWN830sOwfZwzKVw5N0JS0HFjiB/PO8TTy5hJ2p+Wb6S2
uUwQdo8fwvvD1hNeJiJVH22s+fDhmG9PDMpOrzXpRkiC9YzzXTRZwOn6oRtXTKIF
5LdvpxwKSi641Yl2yCnUW7A7V9zYUVIOh4m9blP+XGJvW22+l3dAd7gfyXyxZB0v
9QIDAQAB
—–END PUBLIC KEY—–

Chaves Pública e Privada em um Mesmo Arquivo

Adicionalmente, suponha que você já tenha um arquivo, que chamaremos de keypair.kp, cujo conteúdo seja a concatenação das chaves privada e pública:

—–BEGIN RSA PRIVATE KEY—–
MIIEowIBAAKCAQEAzupZUuiV9mS1i1KRQKFyYeo6fwFZB1GumwPnkHi6xNgX3YgK
kZPN1agIKFuII795lP+GnB2/+mxbszXZx7Q2VjwaqZMiOBHCXJjZZe6lYRumbMUD
cEex1tcUhufpSsSXcxglNwYEPOeAeC96x4QLTpDNCf4fyY6IdZHQINEnKJdxT1Rv
7i00d8OeF2pk8z3Y1QJDrZQghjHEvpxqBqVBkPYrqtjAhMHwKZo5Zi7bcBM5vmJ3
b5iDs1MjvHYLgd0TPBQPiz3bKQ5CbDAuMFHw0XPTWz0luHbcsvKVK0PBSt0ciWeZ
TGeQs+xnaYmQpS/d5HPk8t2ygKuZdukBtSwVGQIDAQABAoIBABXPZfLzSTtbijdR
ULY7Tk873Uad4cB/v6PfWX1E/IrbLEjRmiuWJNAskg+O9l6uRCaMeKfkCuRen5vY
RUhjmoakdzsAo069sHsKMYApE42U2IoGikI/jGNU8Hj34QNcjYo4NVQDclbpIAWL
G6oEJRz27mXrP3aDa6bY49NRuIrymumsCksMT+jR1fW7sYMmDr8drdSyMn4LROSN
ntiSBG2Ab3ltiZPhGI/YTxru+C8xzU9htqVwvKqVtcEfNZ17g6fd/W29mTGB+B5S
zDjFmm5fTJW2iiEPpZ8hFYlo4lqXtTtALdJndMk4f8vbs8mfgRAB9qbuYqv2ijY/
EoSNFAECgYEA/EE+TtN8zoYf6LLE7FXIXKZX6VHrbbyQhFyrhJ8UC8vhemtTcli2
2nKzaJN4Vv5voXkKMlp4J3NL45VIIx6kupWMqEls3a6HLhZ5AnegVlNeK/kQFFaH
7Q9lpnntpFIHOQe4FrH8maEs1you2fvJafgRzpVUlmKPgVCsOnl5K3kCgYEA0fzI
KNig3044lKZAszXb/iPUHq4TdPcSiqeEjzMPd+Zmxx4hbrsjYPuAbMsTfiNMRC2p
3yECCuUSpuwlgVbf9Ol4PEd8PWaMDyLDYT/2tcS6YWErvVlFG9uhgyF1sh1fdNB+
Z61YK1/uOC7rQTYZt2NNiFL495CmUOTRk6loLqECgYBSr2gnGneskpZfBko6VZwJ
kpT6a9nJ7KdKW731CNffTgMox4lgz+eQD0zzmHM3wMsCmNRY0QLVm5tijApLSL4i
Uub6OqcuuwigeMlNn7y0zzrtGwTEReDkOcnOGeVlmWW4sekLt2ffS8+Q78jPtxK8
Y44isxw49zGm57SsriijsQKBgQCAP1yX5cZK2+EemHNHgIt9qbAxlKt5cjS2zhzd
wJef6O24iqRslorC/peu2lBrZ2967FClX+l5cfJ0VCGL3t0lHTo7xoUQkwLTc63U
RVaOKTqTot8t48mbfAYmqlbRk7LrCzNIasxAoXRCiBVSXJJUOKfvrI011fhdy4Jc
JsjkQQKBgEZsXhqYO+BK7IbOlVRwiN2kC6XlZl7lClpkjGPw7JVt0OZ/7EUni59O
e1UPHwflzdInOrog8UpVqJJp6Xp9hK14gIdtFMFIncak8DspCYdviYnaUJALXhO2
HjG1eqrp1E701fGJKHKFSonWogKa+7ecBgm9FaDHJcULfJorYeRf
—–END RSA PRIVATE KEY—–
—–BEGIN PUBLIC KEY—–
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzupZUuiV9mS1i1KRQKFy
Yeo6fwFZB1GumwPnkHi6xNgX3YgKkZPN1agIKFuII795lP+GnB2/+mxbszXZx7Q2
VjwaqZMiOBHCXJjZZe6lYRumbMUDcEex1tcUhufpSsSXcxglNwYEPOeAeC96x4QL
TpDNCf4fyY6IdZHQINEnKJdxT1Rv7i00d8OeF2pk8z3Y1QJDrZQghjHEvpxqBqVB
kPYrqtjAhMHwKZo5Zi7bcBM5vmJ3b5iDs1MjvHYLgd0TPBQPiz3bKQ5CbDAuMFHw
0XPTWz0luHbcsvKVK0PBSt0ciWeZTGeQs+xnaYmQpS/d5HPk8t2ygKuZdukBtSwV
GQIDAQAB
—–END PUBLIC KEY—–

Nesse caso, rode o openssl com os parâmetros abaixo para extrair a chave privada desse arquivo, remova o trecho referente à chave privada daquele arquivo e o renomeie para “pubkey.kp”:

$openssl rsa -in keypair.kp -out privkey.kp
$mv keypair.kp pubkey.kp

O conteúdo desse arquivo ficará assim:

—–BEGIN RSA PRIVATE KEY—–
MIIEowIBAAKCAQEAzupZUuiV9mS1i1KRQKFyYeo6fwFZB1GumwPnkHi6xNgX3YgK
kZPN1agIKFuII795lP+GnB2/+mxbszXZx7Q2VjwaqZMiOBHCXJjZZe6lYRumbMUD
cEex1tcUhufpSsSXcxglNwYEPOeAeC96x4QLTpDNCf4fyY6IdZHQINEnKJdxT1Rv
7i00d8OeF2pk8z3Y1QJDrZQghjHEvpxqBqVBkPYrqtjAhMHwKZo5Zi7bcBM5vmJ3
b5iDs1MjvHYLgd0TPBQPiz3bKQ5CbDAuMFHw0XPTWz0luHbcsvKVK0PBSt0ciWeZ
TGeQs+xnaYmQpS/d5HPk8t2ygKuZdukBtSwVGQIDAQABAoIBABXPZfLzSTtbijdR
ULY7Tk873Uad4cB/v6PfWX1E/IrbLEjRmiuWJNAskg+O9l6uRCaMeKfkCuRen5vY
RUhjmoakdzsAo069sHsKMYApE42U2IoGikI/jGNU8Hj34QNcjYo4NVQDclbpIAWL
G6oEJRz27mXrP3aDa6bY49NRuIrymumsCksMT+jR1fW7sYMmDr8drdSyMn4LROSN
ntiSBG2Ab3ltiZPhGI/YTxru+C8xzU9htqVwvKqVtcEfNZ17g6fd/W29mTGB+B5S
zDjFmm5fTJW2iiEPpZ8hFYlo4lqXtTtALdJndMk4f8vbs8mfgRAB9qbuYqv2ijY/
EoSNFAECgYEA/EE+TtN8zoYf6LLE7FXIXKZX6VHrbbyQhFyrhJ8UC8vhemtTcli2
2nKzaJN4Vv5voXkKMlp4J3NL45VIIx6kupWMqEls3a6HLhZ5AnegVlNeK/kQFFaH
7Q9lpnntpFIHOQe4FrH8maEs1you2fvJafgRzpVUlmKPgVCsOnl5K3kCgYEA0fzI
KNig3044lKZAszXb/iPUHq4TdPcSiqeEjzMPd+Zmxx4hbrsjYPuAbMsTfiNMRC2p
3yECCuUSpuwlgVbf9Ol4PEd8PWaMDyLDYT/2tcS6YWErvVlFG9uhgyF1sh1fdNB+
Z61YK1/uOC7rQTYZt2NNiFL495CmUOTRk6loLqECgYBSr2gnGneskpZfBko6VZwJ
kpT6a9nJ7KdKW731CNffTgMox4lgz+eQD0zzmHM3wMsCmNRY0QLVm5tijApLSL4i
Uub6OqcuuwigeMlNn7y0zzrtGwTEReDkOcnOGeVlmWW4sekLt2ffS8+Q78jPtxK8
Y44isxw49zGm57SsriijsQKBgQCAP1yX5cZK2+EemHNHgIt9qbAxlKt5cjS2zhzd
wJef6O24iqRslorC/peu2lBrZ2967FClX+l5cfJ0VCGL3t0lHTo7xoUQkwLTc63U
RVaOKTqTot8t48mbfAYmqlbRk7LrCzNIasxAoXRCiBVSXJJUOKfvrI011fhdy4Jc
JsjkQQKBgEZsXhqYO+BK7IbOlVRwiN2kC6XlZl7lClpkjGPw7JVt0OZ/7EUni59O
e1UPHwflzdInOrog8UpVqJJp6Xp9hK14gIdtFMFIncak8DspCYdviYnaUJALXhO2
HjG1eqrp1E701fGJKHKFSonWogKa+7ecBgm9FaDHJcULfJorYeRf
—–END RSA PRIVATE KEY—–

Se você quiser, pode acrescentar uma senha para proteção da chave privada:

$openssl rsa -in keypair.kp -out privkey.kp -des3 -passout pass:Teste123

Renomeie o arquivo “keypair.kp” para “pubkey.kp”. Abra o arquivo “pubkey.kp” e remova o trecho referente à chave privada. O arquivo se parecerá com esse:

—–BEGIN PUBLIC KEY—–
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzupZUuiV9mS1i1KRQKFy
Yeo6fwFZB1GumwPnkHi6xNgX3YgKkZPN1agIKFuII795lP+GnB2/+mxbszXZx7Q2
VjwaqZMiOBHCXJjZZe6lYRumbMUDcEex1tcUhufpSsSXcxglNwYEPOeAeC96x4QL
TpDNCf4fyY6IdZHQINEnKJdxT1Rv7i00d8OeF2pk8z3Y1QJDrZQghjHEvpxqBqVB
kPYrqtjAhMHwKZo5Zi7bcBM5vmJ3b5iDs1MjvHYLgd0TPBQPiz3bKQ5CbDAuMFHw
0XPTWz0luHbcsvKVK0PBSt0ciWeZTGeQs+xnaYmQpS/d5HPk8t2ygKuZdukBtSwV
GQIDAQAB
—–END PUBLIC KEY—–

Verificação

Vamos simular o envio de uma mensagem criptografada de um remetente para um receptor. O remetente possui a chave pública do receptor e a utilizará para criptografar a mensagem. Crie um arquivo qualquer e insira um pequeno texto nele. Criei o arquivo arquivo.txt:

$openssl rsautl -encrypt -inkey pubkey.kp -pubin -in arquivo.txt -out encriptado.ssl

Esse comando produziu o arquivo encriptado.ssl, que está criptografado e só poderá ser lido por quem detiver a chave privada relacionada à chave pública. É importante lembrar que na criptografia assimétrica, uma mensagem pode ser criptografada ou descriptografada com ambas as chaves, mas se uma for utilizada para criptografar, apenas a outra poderá ser utilizada para descriptografar:

$openssl rsautl -decrypt -inkey privkey.kp -in encriptado.ssl -out decripatado.txt

O arquivo decripatado.txt possui o texto original enviado pelo remetente.

Referências

1. [https://stackoverflow.com/questions/5244129/use-rsa-private-key-to-generate-public-key]
2. [https://rietta.com/blog/2012/01/27/openssl-generating-rsa-key-from-command/]
3. [https://blog.sleeplessbeastie.eu/2017/12/28/how-to-generate-private-key/]
4. [https://www.mkssoftware.com/docs/man1/openssl_genrsa.1.asp]
5. [https://www.devco.net/archives/2006/02/13/public_-_private_key_encryption_using_openssl.php]
6. [https://unix.stackexchange.com/questions/296697/how-to-encrypt-a-file-with-private-key]

Caverna do Dragão: O Início Desvendado

Triste não é mudar de ideia, mas sim não ter ideias para mudar

Mestre dos Magos, parafraseando Francis Bacon

O desenho Caverna do Dragão (Dungeons & Dragons) possui 28 episódios dos quais 27 foram produzidos e exibidos em três temporadas que passaram na rede americana CBS entre 1983 e 1986. Os episódios começaram a passar na Globo em 1986 e fizeram muito sucesso por aqui. Acho que quase todo mundo conhece a trama: em um parque de diversões, seis jovens são transportados acidentalmente para o Reino após entrarem no brinquedo Caverna do Dragão. No Reino, eles conhecem o Mestre dos Magos e cada um recebe uma arma mágica. Eles ficam sabendo que terão que procurar o caminho para casa sozinhos e nessa jornada, sempre com a ajuda bem ambígua do enigmático Mestre dos Magos, eles enfrentarão toda sorte de monstros e adversários, como o malvado bruxo Vingador e o poderoso dragão Tiamat.

Figura 1 – Os Garotos Perdidos ou ainda As Crianças do Mestre dos Magos

Aquele desenho foi inspirado no jogo de RPG (Role-Playing Games) de mesmo nome cujo universo foi fortemente influenciado pelo “pouco conhecido” O Senhor dos Anéis, que por sua vez teve muitas influências da cultura nórdica e germânica, como o poema Beowulf e a Canção dos Nibelungos, e até do cristianismo. Onde quer que você veja um cavaleiro, um dragão, um elfo, um mago ou um anão, separados ou unidos para realizar uma jornada épica, tenha certeza de que ali há a influência inegável do Senhor dos Anéis.

Nesse artigo, vou tratar de um texto que li faz alguns anos – escrito por um tal de Michael D. Bugg – que se propõe a explicar a origem do Reino, do Vingador, de onde vêm os Orcs, os Homens Lagarto, os Sapos Brigões, os Dragões – em especial o poderoso Tiamat – e aqueles demônios que dominavam cidades ou regiões inteiras, como o Beholder (episódio O Olho do Observador – The Eye Of The Beholder), a Fera da Noite (episódio A Cidade à Margem da Meia-Noite – City At The Edge Of Midnight) e a Rainha Syrith (episódio O Filho do Astrólogo – Child Of The Stargazer). Essa história amarra de forma bem interessante esse suposto passado glorioso do Reino e o que ele se tornou após a ascensão do mal. Tive que reescrever algumas partes, porque ainda que criativa, estava muito mal escrita ou talvez mal traduzida. Isso que fiz me lembrou da atuação do Tengo, personagem do livro 1Q84 de Haruki Murakami, no estranho projeto de reescrever o romance A Crisálida de Ar, de autoria da adolescente pouco comunicativa Fuka-Eri.

Como não encontrei referências a esse suposto Michael D. Bugg, suponho que se trata de mais “uma das muitas faces do mal, conhecidas apenas como o Vingador”. Bem, na verdade esse “D. Bugg” já me pareceu um trocadilho com a palavra inglesa debug, jargão utilizado pelos desenvolvedores de software para se referirem ao ato de encontrar e corrigir erros; depurar o código fonte. Forçando um pouco a imaginação, poderíamos dizer que as sílabas da palavra “Michael” fazem alusão às duas palavra inglesas “my” e “call”. Ajustando em uma frase, ficaria “call me” ou “me chamo”. Sendo assim, agora forçando a sua amizade, caro leito, Michael D. Bugg seria algo como “me chamo depurador”!. Pelo acúmulo de evidências que apontavam nessa direção, cheguei à conclusão que se trata de uma fanfic. Tirando a questão do nome do suposto autor, colaborou muito para essa conclusão o fato de que uma fanfic, embora não seja regra, costuma ser mal escrita: o texto é contraditório, prolixo, redundante e/ou é gramaticalmente sofrível. Se você souber de alguma referência confiável sobre essa história e sobre seu autor, comente aí embaixo que eu altero o texto.

Cada fanfic foca em um determinado aspecto da história original ou de algum personagem, mas sem o objetivo de ferir direitos autorais. Seria paradoxal existir uma fanfic que se proponha a fazer um reboot. Também não faria muito sentido se uma fanfic forçasse um remake, pois elas não têm essa pretensão. Ainda utilizando jargão de filmes ou séries animadas, faria sentido uma fanfic trabalhar prequels e spin-offs. Uma fanfic, embora não seja literatura oficial, também tem seus méritos. Na época em que Harry Potter estava na moda, havia algumas histórias bem legais por aí. A melhor que li foi Draco Dormiens, primeira parte da Trilogia Draco, escrita por Cassandra Clare. Se eu tivesse tempo e mais imaginação, escreveria uma fanfic sobre o Tiamat – talvez alguém já a tenha escrito. Isso não tem importância, mas você já notou como o Tiamat se parece com uma Quimera?

Figura 2Tiamat

Figura 3Quimera

O Início Desvendado

fanfic apresentada como um artigo de “Michael D. Bugg”

Introdução

Essa é uma matéria feita por Michael D. Bugg, que traz revelações surpreendentes. Você irá descobrir a fonte do poder do Mestre dos Magos, a origem do Vingador e o porquê de sua irmã Karena ter ficado má. Descubra o que aconteceu no Reino na época anterior à aparição dos garotos da Terra. Você será introduzido ao mundo de Caverna do Dragão e vai entender muitas coisas que até então estavam envolvidas no mais profundo mistério. Boa leitura!

A Idade da Glória

Durante a Idade da Glória, o Reino era guiado pelo Grande Conselho dos Feiticeiros. Os muitos reinos resolviam seus problemas em um fórum mantido pelo Conselho – mais tarde conhecido como o Refúgio das Sombras – para que pudessem resolver seus problemas sem precisarem entrar em guerra. Nesse fórum eram mantidas cuidadosas anotações para que nenhuma sabedoria fosse perdida e era feita uma guarda cuidadosa dos vários portais para os mais diversos mundos que tangenciavam o Reino.

O chefe do Conselho se tornava um Mestre dos Magos. No Mestre dos Magos era depositado todo o poder do Conselho, o que o tornava verdadeiramente o Mestre do Reino ou a lei propriamente dita. Entretanto, para contra-balancear o poder do Mestre dos Magos, o Conselho determinou que ele estaria sujeito à uma regra: não interferir diretamente nos assuntos das pessoas se existir outra alternativa; deixar que as pessoas escolham seus próprios caminhos e nunca dar a elas conhecimento que elas poderiam adquirir sozinhas. Assim, o Mestre dos Magos teve que usar o raciocínio ao invés da força, a sutileza ao invés das demonstrações de poder e o encorajamento ao invés da coerção. Raramente houve uma decisão, tomada pelo Conselho ou pelo próprio Mestre dos Magos, que causasse mais destruição.

Alguns anos antes das Grandes Guerras, o Conselho deu as boas-vindas aos seus dois mais novos membros: Kyllan e Karena, as crianças do atual Mestre dos Magos. Ambos eram ambiciosos e arrogantes por sua juventude, mas acreditava-se que o tempo daria a eles a sabedoria necessária. Para cada um deles foi dado um anel: o Anel da Mente para Kyllan e o Anel do Coração para Karena. Esses anéis eram os catalisadores de seus poderes e também eram um elo de ligação entre os dois irmãos – mente e coração trabalhando juntos.

A Ascensão do Mal

Kyllan era particularmente ambicioso e, em sua ânsia pelo conhecimento e pelo poder, formou diversos pactos maléficos que eventualmente o levaram a descobrir a existência Daquele Cujo Nome Não Pode Ser Dito (The Nameless One). Kyllan entregou-se voluntariamente à esta criatura em troca do poder que ele procurava para atingir seus objetivos e então se transformou na encarnação das trevas e deu a si mesmo o nome de Vingador.

Usando a ligação entre os dois anéis, o Vingador corrompeu Karena para as trevas e os dois promoveram uma ataque ao Conselho, que resultou na morte da maioria dos magos e a fuga dos sobreviventes. O Vingador tomou para si o controle dos Portais e os escancarou para procurar por servos que o ajudassem em suas conquistas. Ele encontrou os mundos dos orcs, dos homens-lagarto e vários outros. Achando utilidade nestas raças primitivas, ele as escravizou e as usou para compor seus exércitos. Em suas buscas, ele também encontrou o mundo dos dragões e libertou estas bestas para aterrorizar o Reino e consolidar sua autoridade. Porém, para sua própria desgraça, ele chamou a atenção de Tiamat, Rainha do Caos e de todos os dragões, que seguiu aquelas dentre as suas crianças que responderam ao chamado do Vingador. O Vingador não tinha nenhum controle sobre Tiamat e ela o perseguia quebrando o que de outra forma seria um completo domínio do Reino.

Na mesma época, o mago Merlin – que alguns supunham que era o Mestre dos Magos daquela época – ferido pelo primeiro ataque do Vingador, fez sua última mágica: invocando todos dos dragões nas proximidades para os céus da então grande cidade de Helix, poderoso centro comercial daquela época, ele os aprisionou em uma dimensão atemporal. Devido a esse último grande esforço, Merlin sucumbiu logo em seguida. Sem seu sacrifício, é provável que o Reino estivesse destituído de vida há muito tempo, mas isso não impediu que A Idade das Trevas, de um milênio de duração, se lançasse sobre todo o Reino.

A Idade das Trevas

Mesmo sem a presença de Tiamat, o domínio do Vingador sobre o Reino não era tão absoluto quanto poderia ter sido. Cada cidade importante tinha algum poder vindo do comércio e é verdade que muitas delas eram controladas por demônios, feiticeiros e senhores da guerra leais ao Vingador. A Rainha Siris de Tarod, por exemplo, tinha quase que um controle autônomo de seus estados e os governou com mão de ferro por mil anos até que a profecia do Filho do Astrólogo se cumpriu. Também é fato que as terras desoladas, em muitos lugares tornadas áridas pelas mágicas lançadas nas Grandes Guerras, não eram mais um refúgio, pois se tornaram lar de muitas fantásticas e mortais criaturas convocadas pelo Vingador. Porém, era justamente desses locais que vinham algumas das poucas fontes de luz nesta terra de escuridão: a poderosa Cidade de Tardos, o secreto Vale dos Unicórnios e as poderosas Terras do Leste, que resistiam sob o controle da linhagem de Rahmud. Estes locais eram poucos e distantes uns dos outros, mas conseguiram a liberdade apenas através do sangue de guerreiros corajosos ou do total isolamento geográfico.

Em algum ponto durante esta época, o Mestre dos Magos encontrou o Cemitério dos Dragões, lar de Tiamat. Lá ele descobriu algo curioso: quando um dragão morria, um objeto de grande poder – em geral uma arma mágica – era criado. O Mestre dos Magos pegou algumas destas armas do Cemitério na ausência de Tiamat e, no momento oportuno, as entregou para seis crianças.

A partir daí, todos conhecem a história.

Referências

1. [http://revistagalileu.globo.com/Galileu/0,6993,ECT533129-1719-1,00.html]
2. [https://www.aficionados.com.br/caverna-do-dragao-segredos-misterios-e-curiosidades/]
3. [https://seuhistory.com/hoje-na-historia/chega-ao-fim-producao-da-serie-caverna-do-dragao]
4. [https://www.youtube.com/watch?v=Ed1Kbs_p_wk]
5. [https://docslide.us/documents/caverna-do-dragao-o-inicio-desvendado.html]
6. [https://cartoonscrapbook.com/cartoons/dungeons-dragons-1983/]