Alienígenas Presos na Gravidade de Super Terras

Para Leibniz, habitamos “o melhor dos mundos possíveis”. Será mesmo? Para podermos contra-argumentar, faz-se necessário comparar nosso planeta com outros mundos, mas primeiro é necessário encontrar vida em algum desses mundos. Melhor seria se encontrássemos seres inteligentes nesses mundos. Até hoje, não encontramos ninguém habitando as Super Terras ou algum dos mais de 4000 exoplanetas já descobertos.

“Onde está todo mundo?” é a pergunta fundamental do Paradoxo de Fermi, que é uma aparente contradição entre a alta probabilidade de existência de vida inteligente em outras regiões do universo e a falta de evidência de sua existência.

O Sérgio Sacani, do canal Space Today, nos lembrou que coisas como o Paradoxo de Fermi e a famosa Equação de Drake foram elaboradas em uma época em que a astronomia não sabia da existência de exoplanetas e muito menos que haveria alguns que orbitavam a zona habitável de suas estrelas. Ele gravou um vídeo para divulgar uma possível resposta àquele paradoxo baseado em um artigo de Michael Hippke: os alienígenas estão presos à gravidade das Super Terras. Supondo que esses alienígenas não têm tecnologias que apenas a ficção científica especula, eles precisariam no mínimo de uma tecnologia mais avançado do que a nossa para produzirem foguetes poderosos o suficiente para conseguir atingir a velocidade de escape necessária para alcançar o espaço à partir desses planeta que supostamente têm gravidade maior que a da Terra.

Super Terras como a Kepler-20b têm de 6 a 11 vezes a massa da Terra. Se uma Super Terra tiver em média 10 vezes a massa da Terra, um foguete lançado de lá teria que ter 440.000t praticamente só de combustível para gerar a propulsão necessária, o que seria economicamente inviável. No artigo, o autor faz até algumas considerações sobre o lançamento do foguete à partir do cume de uma montanha. Para ele, mesmo uma montanha do tamanho do Monte Olimpo em Marte (21,9 km) não teria a altura necessário para viabilizar o lançamento. Ele sugere a criação de montanhas artificiais para servirem de plataforma de lançamento, mas você consegue imaginar o desafio tecnológico de se erguer uma estrutura com algumas dezenas de quilômetros de altura? Depois de fazer mais alguma considerações sobre o lançamento de foguetes em mundos aquáticos, o autor conclui que a única fonte de energia conhecida capaz de gerar a propulsão necessária para viabilizar o lançamento de um foguete em uma Super Terra é a energia nuclear.

Naquele vídeo, o Sérgio Sanai pediu que as pessoas comentassem essa notícia. Não faltaram ideias: sugeriram que a propulsão fosse feita com Redbull, Canabis ou super garrafa de Coca-Cola com super Mentos. Um cara lembrou do famoso motor de improbabilidade infinita e um outro perguntou se alienígenas presos na gravidade de Super Terras teriam a força do Super Homem aqui na Terra.

Se existirem civilizações habitando Super Terras, seria mais indicado que elas focassem em tecnologias de comunicação e visualização ao invés de tentarem a exploração presencial. Se for assim, por que ainda não nos enviaram um “olá”? E assim, voltamos ao Paradoxo de Fermi.

Referências

1. [https://phys.org/news/2018-05-aliens-earth-gravity-worlds.html]
2. [https://arxiv.org/pdf/1804.04727.pdf]

Anúncios

Como Publicar Artefatos Automaticamente no Nexus

Em outro artigo, expliquei a exceção, que é incluir um jar sem pom ao Maven. Em um artigo mais recente, mostrei uma forma um pouco melhor, que é fazendo o deploy daquele jar no repositório local. Nesse artigo, vou descrever um caminho bem melhor, que é utilizando o Nexus, uma ferramenta que permite o gerenciamento centralizado dos artefatos dos nossos projetos.

Primeiro, você deve adicionar as configurações específicas do Nexus no seu arquivo de configurações do Maven, que fica lá no diretório onde ele está instalado. Basicamente, você deve configurar um mirror e um profile.

<settings>
  <mirrors>
    <mirror>
      <id>nexus</id>
      <mirrorOf>*</mirrorOf>
      <url>http://10.100.0.1:8081/nexus/content/groups/public</url>
    </mirror>
  </mirrors>
  <profiles>
    <profile>
      <id>nexus</id>
      <!--Enable snapshots for the built in central repo to direct -->
      <!--all requests to nexus via the mirror -->
      <repositories>
        <repository>
          <id>central</id>
          <url>http://central</url>
          <releases><enabled>true</enabled></releases>
          <snapshots><enabled>true</enabled></snapshots>
        </repository>
      </repositories>
     <pluginRepositories>
        <pluginRepository>
          <id>central</id>
          <url>http://central</url>
          <releases><enabled>true</enabled></releases>
          <snapshots><enabled>true</enabled></snapshots>
        </pluginRepository>
      </pluginRepositories>
    </profile>
  </profiles>
  <activeProfiles>
    <!--make the profile active all the time -->
    <activeProfile>nexus</activeProfile>
  </activeProfiles>
   <servers>
    <server>
      <id>deployment</id>
      <username>deployment</username>
      <password>deployment</password>
    </server>
    <server>
      <id>releases</id>
      <username>admin</username>
      <password>admin</password>
    </server>
  </servers>
</settings>

Agora vamos criar um projeto de teste. Adicione ao POM desse projeto, na seção distributionManagement, as informações do repositório do Nexus onde sua dependência será implantada.

<project xmlns="http://maven.apache.org/POM/4.0.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
    http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>br.com.tst</groupId>
  <artifactId>teste</artifactId>
  <packaging>pom</packaging>
  <version>0.0.1</version>

  <modules>
  	<module>teste-module</module>
  </modules>
  
  <distributionManagement>
    <repository>
      <id>releases</id>
      <url>http://10.100.0.1:8081/nexus/content/repositories/releases</url>
    </repository>
  </distributionManagement>
</project>

Crie um módulo para o seu projeto. Isso é apenas para deixar a estrutura mais interessante. Em um projeto real, você provavelmente trabalhará com módulos para melhor organização:

<project xmlns="http://maven.apache.org/POM/4.0.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
    http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>br.com.tst</groupId>
    <artifactId>teste</artifactId>
    <version>0.0.1</version>
  </parent>
  <artifactId>teste-module</artifactId>
  <packaging>jar</packaging>
</project>

Rode o comando abaixo para implantar o artefato no Nexus:

mvn deploy

Você também pode rodar o comando abaixo para instalar seu pacote no repositório local do maven:

mvn install

Lá no Nexus, uma estrutura assim deve ter sido criada no repositório releases:

Finalmente, para utilizar essa dependência em outro projeto, basta referenciá-la normalmente no POM:

<project xmlns="http://maven.apache.org/POM/4.0.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
    http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <dependencies>
  (...)
     <dependency>
       <groupId>br.com.tst</groupId>
       <artifactId>teste</artifactId>
       <version>0.0.1</version>
     </dependency>
  (...)
  </dependencies>
</project>
Categorias:Programação Tags:, , ,

Como Realizar o Deploy Local de um jar sem POM

Suponha que você não tem um Nexus ou por algum motivo o servidor onde ele estava explodiu. É por isso que você deve pensar muito bem antes de mandar o Wally embora:

A ausência do Wally não é desculpa para utilizar o atributo systemPath do POM para criar uma dependência para um jar que está em algum lugar que provavelmente apenas você conheça. Um jeito melhor é implantar o jar no repositório local com o comando deploy-file:

mvn deploy:deploy-file 
-Dfile={PATH}\meujar-1.0.0.jar 
-DgroupId=br.com.teste
-DartifactId=meujar
-Dversion=1.0.0
-Dpackaging=jar
-Durl=file:{MAVEN_REPO_PATH}\.m2\repository\ 
-DrepositoryId=m2 
-DupdateReleaseInfo=true

Se o seu jar for um snapshot, o comando deploy calcula o timestamp e modifica o nome do arquivo. Agora, basta referenciá-lo normalmente no seu arquivo POM:

<dependency>
	<groupId>br.com.teste</groupId>
	<artifactId>meujar</artifactId>
	<version>1.0.0</version>	
</dependency>

Referências

1. [http://roufid.com/3-ways-to-add-local-jar-to-maven-project/]
2. [https://support.sonatype.com/hc/en-us/articles/213465818-How-can-I-programmatically-upload-an-artifact-into-Nexus-2-?mobile_site=true]

Como Adicionar Itens ao Menu de Contexto do Windows

Sabe aquele executável sem instalador que você utiliza no Windows? Se você prefere utilizar o mouse para executar aquela ferramenta, não seria melhor que ela estivesse acessível à partir do menu de contexto? Basta executar o regedit.exe e adicionar uma entrada ao registro do Windows para que a opção esteja acessível no menu de contexto quando você clicar no botão direito do mouse.

Para exemplificar, vamos adicionar o MD5 & SHA Checksum Utility, uma ferramenta que gera e verifica hashes criptográficos em MD5 e SHA-1.

Primeiro, procure essa entrada no registro:

HKEY_CLASSES_ROOT\Directory\Background\shell

Clique com o botão direito em shell, selecione Novo e em seguida em Chave. Dê o nome de SHA1 a essa nova chave. Em seguida, clique com o botão direito em SHA1, selecione Novo e em seguida em Chave. Dê o nome command para essa nova chave.

Para finalizar, clique em command na parte esquerda da janela e dê um duplo clique na chave (Default) no lado direito da janela para editar o valor. Insira o caminho para o seu arquivo executável. No final, a configuração ficará parecida com essa:

O Paradoxo da Melância

A melancia é uma ótima fruta para consumir no verão e também possui vários benefícios para a saúde. Sabemos que uma melancia tem mais de 90% de água (massa líquida) e o restante é massa seca (carboidratos, sódio, vitaminas, potássio, cálcio e etc).

A MathGurl compartilhou o que ela chamou de o Paradoxo da Melancia, que na verdade não é um paradoxo, mas sim um problema aparentemente simples que tem uma conclusão contra-intuitiva provada pela matemática. Essa é mais uma das provas de que a intuição te engana. Partamos de uma melancia de 1kg composta de 99% de água – praticamente um suco de melancia concentrado. Se 99% da melancia é água (massa líquida), 1% é massa seca. Chamaremos a massa seca de MS, a massa líquida de ML e a massa total da melancia de MT (Ms + Ml):

ML (99%): 990g
MS (1%): 10g
MT (100%): 1000g

Após algumas horas sob ação do sol, a melancia se desidratou. Agora, a massa líquida da melancia representa 98% da massa total. Pergunta-se: qual é a massa total da melancia após a desidratação? É nesse momento que nossa intuição nos dá uma rasteira. Você provavelmente está supondo que basta calcular 98% de 1000g (massa da melancia) ou 98% de 990g (massa líquida original). Na verdade, não podemos nos basear na parte variável da massa. Devemos considerar a massa sólida, pois ela não varia em função da desidratação, e vamos chamar de x a massa líquida que a melancia perdeu com a desidratação:

ML (98%): xg
MS (2%): 10g
MT (100%): [(1000-x)+10]g

Agora sim, podemos fazer uma regra de três bem simples:

10g = 2%
xg = 98%
x = 490g

Conclusão

Após a desidratação, a melancia perdeu metade de sua massa total:

ML (98%): 490g
MS (2%): 10g
MT (100%): 500g

Categorias:Matemática

Assinando E-mail Digitalmente com o Bouncy Castle

O Bouncy Castle é uma coleção de APIs usadas em criptografia para Java. O código abaixo é um exemplo de como assinar um e-mail digitalmente com essa API.

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.PrivateKey;
import java.security.Security;
import java.security.UnrecoverableKeyException;
import java.security.cert.Certificate;
import java.security.cert.CertificateEncodingException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;

import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;

import org.bouncycastle.asn1.ASN1EncodableVector;
import org.bouncycastle.asn1.cms.AttributeTable;
import org.bouncycastle.asn1.cms.IssuerAndSerialNumber;
import org.bouncycastle.asn1.smime.SMIMECapabilitiesAttribute;
import org.bouncycastle.asn1.smime.SMIMECapability;
import org.bouncycastle.asn1.smime.SMIMECapabilityVector;
import org.bouncycastle.asn1.smime.SMIMEEncryptionKeyPreferenceAttribute;
import org.bouncycastle.asn1.x500.X500Name;
import org.bouncycastle.cert.jcajce.JcaCertStore;
import org.bouncycastle.cms.SignerInfoGenerator;
import org.bouncycastle.cms.jcajce.JcaSimpleSignerInfoGeneratorBuilder;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.mail.smime.SMIMESignedGenerator;
import org.bouncycastle.operator.OperatorCreationException;
import org.bouncycastle.util.Store;

public class MailSigner {

   private static final String BOUNCE_CASTLE_PROVIDER = "BC";
   private static final String CRYPT_FILE_FORMAT = "PKCS12";
   private static final String CRYPT_ALGORITH = "RSA";
   private static final String SHA1_PKCS_PROVIDER = "SHA1withRSA";
   private static final String MD5_PKCS_PROVIDER = "MD5withRSA";

   private SMIMECapabilityVector capabilities;

   public MailSigner() {
      load();
   }

   private void load() {
      capabilities = new SMIMECapabilityVector();
      capabilities.addCapability(SMIMECapability.dES_EDE3_CBC);
      capabilities.addCapability(SMIMECapability.rC2_CBC, 128);
      capabilities.addCapability(SMIMECapability.dES_CBC);
      /* Adiciona o provider do BouncyCastle */
      Security.addProvider(new BouncyCastleProvider());
   }

   public Message sign(MimeMessage message) throws Exception {
      String password = "SENHA_CERTIFICADO";
      KeyStore keystore = loadKeyStore(password);
      String alias = findAlias(keystore, password);
      if (alias == null) {
         throw new UnrecoverableKeyException("cannot find alias for certificate");
      }

      PrivateKey privateKey = (PrivateKey) keystore.getKey(alias, password.toCharArray());
      Certificate certificate = keystore.getCertificate(alias);
      SMIMESignedGenerator signer = configSigner(certificate, privateKey);
      MimeMessage signedMessage = new MimeMessage(message.getSession());

		/*
		 * Copia todos os MIME header da mensagem original para a mensagem assinada
		 */
		copyHeader(message, signedMessage);

		/* Assina a mensagem */
		MimeMultipart mimeMultipart = signer.generate(message, BOUNCE_CASTLE_PROVIDER);

		/* Insere o conteudo da mensagem original na mensagem assinada */
		signedMessage.setContent(mimeMultipart);
		signedMessage.saveChanges();

		return signedMessage;
	}


	@SuppressWarnings("rawtypes")
	private void copyHeader(MimeMessage message, MimeMessage signedMessage) throws MessagingException {
		Enumeration headers = message.getAllHeaderLines();
		while (headers.hasMoreElements()) {
			signedMessage.addHeaderLine((String) headers.nextElement());
		}
	}

	private String findAlias(KeyStore keystore, String password) throws KeyStoreException, UnrecoverableKeyException,
			NoSuchAlgorithmException {
		Enumeration<String> aliases = keystore.aliases();
		while (aliases.hasMoreElements()) {
			String alias = (String) aliases.nextElement();
			/* Obtem a chave privada do certificado */
			PrivateKey privateKey = (PrivateKey) keystore.getKey(alias, password.toCharArray());
			if (privateKey != null) {
			   return alias;
			}
		}
		return null;
	}

	private KeyStore loadKeyStore(String password) throws KeyStoreException, NoSuchProviderException,
			FileNotFoundException, IOException, NoSuchAlgorithmException, CertificateException {
		File certFile = new File("CAMINHO_ARQUIVO_PFX_ASSINATURA");
		FileInputStream fis = new FileInputStream(certFile);

		/* Carrega o keystore */
		KeyStore keystore = KeyStore.getInstance(CRYPT_FILE_FORMAT, BOUNCE_CASTLE_PROVIDER);
		keystore.load(fis, password.toCharArray());

		return keystore;
	}

	private SMIMESignedGenerator configSigner(Certificate certificate, PrivateKey privateKey)
			throws OperatorCreationException, CertificateEncodingException {
		ASN1EncodableVector attributes = new ASN1EncodableVector();
		attributes.add(new SMIMEEncryptionKeyPreferenceAttribute(new IssuerAndSerialNumber(new X500Name(
				((X509Certificate) certificate).getIssuerDN().getName()), ((X509Certificate) certificate)
				.getSerialNumber())));
		attributes.add(new SMIMECapabilitiesAttribute(capabilities));

		JcaSimpleSignerInfoGeneratorBuilder signerInfoBuilder = new JcaSimpleSignerInfoGeneratorBuilder();
		signerInfoBuilder.setProvider(BOUNCE_CASTLE_PROVIDER);
		signerInfoBuilder.setSignedAttributeGenerator(new AttributeTable(attributes));
		SignerInfoGenerator signerInfoGenerator = signerInfoBuilder.build(
				CRYPT_ALGORITH.equals(privateKey.getAlgorithm()) ? SHA1_PKCS_PROVIDER : MD5_PKCS_PROVIDER, privateKey,
				(X509Certificate) certificate);

		SMIMESignedGenerator signer = new SMIMESignedGenerator();
		signer.addSignerInfoGenerator(signerInfoGenerator);

		/* Adiciona a lista de certificados no Bouncy Castle */
		List<Certificate> certList = new ArrayList<Certificate>();
		certList.add(certificate);
		Store certs = new JcaCertStore(certList);
		signer.addCertificates(certs);
		return signer;
	}
}

Referências

1. [http://www.docjar.org/src/api/org/bouncycastle/mail/smime/examples/CreateSignedMail.java]
2. [http://grepcode.com/file/repo1.maven.org/maven2/org.bouncycastle/bcmail-jdk16/1.46/org/bouncycastle/mail/smime/examples/SendSignedAndEncryptedMail.java#SendSignedAndEncryptedMail.main%28java.lang.String%5B%5D%29]
3. [http://www.thehecklers.org/tag/bouncycastle/]
4. [http://www.thehecklers.org/2013/01/14/secure-email-from-java/]
5. [http://www.docjar.org/html/api/org/bouncycastle/mail/smime/examples/SendSignedAndEncryptedMail.java.html]
6. [http://answer.techwikihow.com/1060825/encrypted-smime-issue.html]
7. [http://fastpicket.com/blog/2012/05/14/easy-pgp-in-java-bouncy-castle/]

A Derivada Mudará sua Vida

Para entender a piada do Oppressive-Silence, é necessário conhecer um pouco de derivadas. Eu só acrescentaria que o seno se transformaria em cosseno e que o cosseno se transformaria em -seno, mas o logaritmo neperiano viraria de pernas para o ar: ele se transformaria em 1/x.