Dicas para o Bash: subshells

Uma das coisas que mais me atraiu, quando comecei a usar Linux, foi a shell. À sua disposição, encontra-se um interpretador de comandos com uma linguagem de programação completa e de altíssimo nível. Não demorou para que eu estivesse escrevendo programas completos nesse interpretador.

Porém, certas coisas parecem não dar certo. Isso porque quem está acostumado a programar em linguagens compiladas pressupõe um comportamento que não é obedecido pela shell. Nem deveria – a shell tem suas peculiaridades e elas têm sua razão de ser. Aí você procura a informação necessária no manual. Digita ‘man bash’ e caboom! Um texto gigantesco aparece para você. A ideia deste post e de outros como este que virão é dar algumas dicas, coisas que podem passar despercebidas por programadores e entusiastas e que seriam difíceis de serem absorvidas em uma leitura do manual.

Eu gosto do Bash. Portanto, vou falar sobre ele. Eu uso a versão 4.2.37 e, portanto, o que é colocado aqui foi testado nele.

Subshells

No Linux (e em sistemas Unix em geral), um processo é originado a pedido de um processo pai. As únicas exceções são a tarefa ociosa e o processo init, que são iniciados diretamente pelo kernel. O processo pai pede para que seja clonado e o kernel constrói um ambiente para que o novo processo execute. Esse ambiente é herdado do processo pai. O significado disso é que o processo filho detém as mesmas variáveis do pai, compartilha alguns recursos com ele, etc. Porém, as variáveis que o filho criar não poderão ser acessadas pelo pai, a menos que o filho permita explicitamente isso (exportando a variável). Uma subshell é um processo filho de uma shell.

Quando executamos um comando externo em uma shell, ele cria uma subshell para este comando. O comando é executado como um processo separado. Para evitar isso, o comando pode ser chamado com a diretiva exec, se necessário. Note que há diferença ao executar um comando externo e uma função interna da shell. O comando cd, é uma função interna (builtin) e não é executado em uma subshell. Para saber se um comando é uma uma função interna ou um programa externo, use ‘type <comando>’. Por exemplo, ‘type ls’ deve retornar o caminho do binário ls (geralmente /bin/ls) e ‘type cd’ deve retornar algo como “cd is a shell builtin”.

Outra ocasião em que uma subshell é criada é quando fazemos redirecionamento de entrada e saída, com um conduíte (o pipe ‘|’). O que vem depois do pipe é executado em uma subshell.

Mas, nós mesmos podemos criar uma subshell. Existem duas maneiras de agruparmos comandos. Uma é usar

{ comando1
  comando2
  ...
  comandoN; }

Esta maneira de agrupamento não cria nova subshell. Note os espaços ao redor das chaves. As chaves, usadas desta maneira, são palavras reservadas da linguagem de programação. Assim, devem ser “isoladas” por espaços em branco. Também, o ponto-e-vírgula é obrigatório, ao final do último comando.

O agrupamento que cria a subshell é o dado por parênteses. Assim,

( comando1
  comando2
  ...
  comandoN )

será executado em uma subshell. Note os espaços em branco ao redor dos parênteses. Façamos uma experiência. Abra um terminal e digite

i=10
echo $i

O resultado deve ser ’10’. Agora, façamos o seguinte:

i=10
( i=70
echo $i )
echo $i

O que aconteceu? A variável i interna à subshell é diferente da variável i do ambiente. Modificações nela, feitas pelo filho, não podem ser vistas pelo pai, a não ser que sejam exportadas. Assim, para o pai, i=10. O filho muda a variável de 10 para 70, mas o pai não recebe as modificações. Tente o mesmo código substituindo o agrupamento de parênteses pelo de chaves.

Tá, e daí?

Suponha que, dentro de um script, queiramos fazer modificações no ambiente, como mudar o diretório de trabalho ou mudar o separador interno de campos, mas depois teremos que restaurar tudo como estava. É só em um trecho do script que essas coisas devem ser diferentes. Uma solução é criar uma variável temporária para cada coisa que você alterar e depois restaurar tudo como estava, torcendo para não se esquecer de nada. Outra é fazer todas as modificações em uma subshell. Ao sair da subshell, as modificações desaparecem, sem precisar guardar nada, sem precisar lembrar do que deve ser restaurado, nada. Simples assim.

Outra utilidade está na execução assíncrona de processos. Em uma shell, ao executarmos um comando, o comportamento padrão é esperar que o comando termine para retornar o controle ao usuário. Esta é a execução síncrona. Se quisermos continuar a executar outros comandos, sem esperar que um determinado comando termine (a execução assíncrona), basta colocarmos o caractere & ao final do comando. É comum as pessoas se referirem a isto como “execução em segundo plano”. Suponha que você precise executar cálculos difíceis em uma máquina com quatro núcleos e que o programa possa ser dividido em quatro blocos de execução. Então, o código

( bloco1 ) &
( bloco2 ) &
( bloco3 ) &
( bloco4 ) &

atribuirá cada bloco a um processador.

Para saber em que nível de aninhamento o código se encontra, há duas variáveis ambiente que guardam essa informação. A primeira delas é a SHLVL (shell level) que indica quantas instâncias aninhadas do Bash estão em execução. Experimente:

echo $SHLVL
bash
echo $SHLVL

O valor deve ter sido incrementado em uma unidade. Esta variável não indica os subníveis, apenas instâncias. Veja:

echo $SHLVL
( echo $SHLVL )

que devem ter fornecido os mesmos resultados. Para saber o subnível, a variável a ser chamada é a BASH_SUBSHELL. Experimente:

echo $BASH_SUBSHELL
( echo $BASH_SUBSHELL )

que deve ter sofrido incremento na subshell. Você pode usar essas variáveis para depurar aquele script em que o laço for, ou while, deveria fazer alguma coisa com uma variável, mas ela não se altera. Estaria ela em uma subshell ao ser alterada? Imprimir o conteúdo dessas variáveis pode ajudar.

Ficou com dúvidas? Alguma curiosidade? Conhece um uso diferente de subshells? Deixe seu comentário!

A ordem que vem do caos

No século XX, as ciências exatas produziram três grandes revoluções que tiveram profundo impacto filosófico. Duas delas são amplamente reconhecidas, a relatividade de Einstein e a física quântica, mas a terceira – e em minha opinião, mais profunda – raramente é vista com este status. Trata-se da teoria do caos, disciplina integrante da área de sistemas dinâmicos.

Quando digo que as primeiras são reconhecidas, refiro-me ao público em geral, obviamente. A relatividade de Einstein nos forneceu um novo olhar sobre o universo. Mudou nossa concepção de tempo e espaço. A relatividade restrita, entre outras coisas, chama nossa atenção para a importância (filosófica) das relações de causa e efeito. Ela provê um caráter absoluto a essas relações, que passam a ditar como a arena em que os eventos ocorrem (o espaço-tempo à nossa volta), se relaciona com seus observadores. Já a relatividade geral… Acho que basta dizer que ela permitiu o desenvolvimento de uma teoria cosmogônica plausível, cientificamente. E isso é apenas um de seus aspectos. Do ponto de vista filosófico, a física quântica também mudou nossa concepção de universo. Um de seus pontos fortes (filosoficamente falando) é que questiona a plausibilidade de uma realidade independente da observação. Ao interagir com um sistema, modificamos suas propriedades. Perguntas do tipo “como era o sistema, antes de ser medido”, deixam de fazer sentido. As visões clássicas do realismo e da localidade, têm de ser abandonadas.

Assim, deixo claro que essas duas disciplinas são revoluções com profundo impacto filosófico. Mas elas têm algo em comum: elas versam sobre correções à nossa realidade. A relatividade de Einstein versa sobre sistemas que possuem ingredientes rápidos (se comparados à velocidade da luz no vácuo), ou com muita energia. Pode ser considerada um desvio da relatividade de Newton, ou melhor, uma correção a ela, em casos extremos, muitas vezes desvinculados da nossa percepção quotidiana. A física quântica versa sobre o pequeno, ou o isolado. Novamente, fenômenos quânticos podem ser vistos como correções aos casos clássicos, na maioria das vezes.

A teoria do caos, por outro lado, fornece uma miríade de princípios filosóficos fundamentais, dentro da nossa percepção quotidiana. Não é uma correção à nossa noção de realidade. Ela derruba a segurança ingênua da previsibilidade determinística dos fenômenos quotidianos, com experiências que podemos fazer em casa. Não só isso. Ela também fornece uma explicação plausível para o surgimento do relógio, sem o relojoeiro – as propriedades emergentes de sistemas complexos e sua capacidade de auto-organização.

A teoria do caos derrubou uma suposição que chegou a nortear boa parte dos avanços científicos até então. A ideia era que, no ambiente clássico, se conhecêssemos todas as condições iniciais (ou de contorno) de um problema, e a descrição de sua evolução, via solução de equações diferenciais, por exemplo, então o sistema seria completamente previsível. Ocorre que isso não é verdade. Para uma certa classe de sistemas, condições iniciais muito próximas podem se tornar arbitrariamente distantes, com a evolução do sistema. Não se trata de se afastarem indefinidamente – alguns pontos próximos podem continuar próximos, enquanto que outros se afastarão muito. Como há sempre uma imprecisão nas medidas, ou até mesmo no arredondamento ao fazermos os cálculos em um computador, não há como sabermos se a aproximação que fizemos refletirá o comportamento real do sistema. Esses sistemas, ditos exibirem dependência sensível das condições iniciais, são, para efeitos práticos, imprevisíveis, a longo prazo. Note que são sistemas determinísticos, ou seja, sabendo como evolui o problema, se soubéssemos as condições iniciais exatamente, a solução seria completamente determinada. Ainda mais, sabendo as condições iniciais com boa precisão, somos capazes de prever o comportamento do sistema, dentro de um limite de tempo, que depende do erro a que estamos dispostos a tolerar. Mas apesar de determinísticos, são imprevisíveis. Mas não tão imprevisíveis quanto um fenômeno verdadeiramente aleatório (dito sistema estocástico). É uma espécie de meio termo. Muitos modelos matemáticos interessantes exibem esse tipo de comportamento. Um exemplo clássico é a equação logística, que descreve uma dinâmica populacional “de brinquedo”. Se x denota a fração de uma população em um tanque (um número entre 0, a extinção, e 1, o tanque com capacidade máxima), a população no próximo período de tempo (no ano seguinte, por exemplo) é calculada como rx(1-x), onde r é uma taxa de natalidade. Esta taxa deve variar entre 0 e 4. Quando a população é pequena, a parcela negativa não é tão importante e a população cresce de acordo com a taxa r, aproximadamente. Quando a população é grande, a parcela negativa se torna importante e a população decresce. Isso modela o esgotamento de recursos, causado por um ambiente superpopulado. Para r entre 0 e 1, o destino da população é a extinção. De 1 a 3,57, aproximadamente, o comportamento da população é oscilatório (a longo prazo). De 3,57 em diante, o comportamento da população, a longo prazo, é imprevisível, para a maioria dos valores de r. Há ainda as “janelas de periodicidade”, onde o comportamento volta a ser previsível. Como se vê, uma equação simples (dito mapa, por se desenvolver em tempo discreto), exibe um comportamento riquíssimo. Os interessados podem ver um pouco mais sobre o mapa logístico na wikipedia (em inglês).

Equações simples podem fornecer um comportamento rico e descrever sistemas bastante complicados. Podemos recorrer aos “sistemas de funções iteradas” (ou IFS) e produzir imagens belíssimas. Como exemplo, cito esta samambaia (a samambaia de Barnsley), que cultivei em meu computador, especialmente para este post.

samambaia

A samambaia de Barnsley

Esta figura é construída partindo-se da origem de um sistema de coordenadas e aplicando, a cada passo, uma de quatro possíveis transformações afins (transformação linear mais translação), escolhida aleatoriamente. São regras extremamente simples que são capazes de produzir a bela figura acima. Esta figura foi produzida com um script em python, usando os pacotes scipy.

Mas há um outro aspecto da teoria que me chama muito a atenção. A teoria dos sistemas complexos. Sistemas complexos se caracterizam por possuir uma enormidade de entidades simples, que interagem entre si, localmente, com uma quantidade muito pequena de elementos. Pilhas de grãos de areia são assim, redes neurais são assim, enfim… Há uma quantidade imensa de sistemas que podem ser modelados dessa forma. Imagine que nossas interações sociais são assim, os mercados financeiros, nossa distribuição geográfica, populações biológicas (em ecossistemas), sinalização celular, transcrição gênica, diferenciação celular… Só para citar alguns.

Aqueles que gostam de brincar com computadores não podem deixar de testar os autômatos celulares. São sistemas compostos por entidades individuais, com estados bem definidos que dependem dos estados de seus vizinhos. Em um dado instante, o sistema tem uma dada configuração. Então calcula-se qual será o estado no instante posterior (o tempo é discreto) e atualiza-se o sistema todo, de uma vez. Um exemplo bem conhecido é o jogo da vida. Aqui eu produzi um gif com uma versão modificada do jogo. Em cada célula, representada por um pixel na figura, há três entidades diferentes. Há pasto, representado na cor verde, em quantidade que pode variar de 0 a 255. O pasto cresce naturalmente e o jogo começa com pasto em tudo. Há herbívoros, representados em azul, em quantidade que pode variar de 0 a 255. Os herbívoros tendem a morrer, se não houver pasto em volta. Mas se houver, prosperam e aumentam em quantidade. Há também predadores, representados em vermelho, cuja quantidade varia entre 0 e 255. Os predadores tendem a morrer se não se alimentarem dos herbívoros adjacentes e prosperam na sua presença. É claro que o número de herbívoros decresce na presença de predadores. Herbívoros e predadores são alocados no início do jogo de maneira aleatória, em cerca de 10 por cento dos pixels. Note que, em um pixel branco há 255 predadores, 255 unidades de pasto e 255 herbívoros. Predadores, pasto e herbívoros são representados segundo o sistema de cores RGB. O gif tem pouco mais de 10 minutos. Foi produzido por um script em python, usando o pacote scipy, que gerou as imagens em png, que foram reunidas em um gif com o programa convert, da suíte ImageMagick.

LVlifex10

Segurança digital

Computadores se tornaram tão onipresentes em nossas vidas que temos a tendência de esquecer que, uma vez conectados a uma rede, o mundo todo pode ter acesso a eles. Muitas pessoas ignoram a necessidade de melhorar a segurança de seus dispositivos sob os mais variados pretextos, como por exemplo, o famoso “eu não tenho nada a esconder”. Será que é só isso mesmo? Quero argumentar aqui que a segurança digital deveria ser uma preocupação de todos.

Quando se fala em segurança de dados, há quatro aspectos que devemos observar. Em primeiro lugar, os dados devem ser acessíveis apenas às pessoas autorizadas a acessá-los. Ou seja, dados privados devem ser privados – esta é a questão da privacidade. Em segundo lugar, não deve ser possível, a pessoas não autorizadas, a destruição ou alteração de dados. Esta é a questão da integridade. Em terceiro lugar, os dados devem estar disponíveis às pessoas autorizadas, sempre que necessário. É a questão da disponibilidade. O último aspecto envolve os três últimos e é válido para ambientes em que muitas pessoas são autorizadas a ter acesso aos dados. Em qualquer atitude de modificação, acesso ou destruição de dados deve ser possível apontar quem foi o autor da ação. Esta é a questão da atribuição de culpa. Quero me concentrar nos três primeiros itens.

Privacidade

Manter dados sensíveis longe de desconhecidos é importante a todas as pessoas. No caso de empresas, expor dados de funcionários, de clientes, de fornecedores ou do seu caixa, pode ser desastroso. Concorrentes podem usar os dados de seu caixa para explorar suas vulnerabilidades e levá-la à falência. Ou roubar seus segredos industriais. Mas há um aspecto mais sutil. Suponha que uma empresa de tecnologia resolva oferecer serviços de hospedagem de dados a várias empresas de um mesmo ramo. As empresas, confiando nos contratos estabelecidos, colocam nas mãos de uma mesma entidade informações sensíveis de seus negócios. A empresa de tecnologia promete não utilizar os dados de seus clientes sem uma prévia “anonimização”. Parece inofensivo, certo? Não é. De posse desses dados, mesmo anonimizados, é possível fazer previsões sobre o comportamento futuro do mercado, que possibilitaria a empresa de tecnologia a manipular todo o setor econômico. É o tipo de poder que instituição alguma deveria ter. Mas é o que tem acontecido. É muito importante que as empresas comecem a manter seus dados privados.

Há setores em que a privacidade tem necessidade óbvia e, ainda assim, é negligenciada. Imagine, por exemplo, profissionais de saúde ou advogados. Se os sistemas que armazenam os dados de seus clientes estiverem vulneráveis a ataques, suas vidas podem ser colocadas em risco. Não conheço um único profissional destas áreas que tenha recebido qualquer treinamento em segurança digital. Em pequenos consultórios ou escritórios, os dados são armazenados em computadores pessoais, com sistemas operacionais inseguros. Outro exemplo são as instituições de pesquisa. Muitas deixam seus computadores completamente expostos, permitindo que informações valiosas caiam nas mãos de pessoas de má índole, ou até mesmo, de nações concorrentes.

Mas nenhum perigo é tão presente quanto ao cidadão comum. Soluções de segurança são chatas e não permitem que certas funcionalidades, tão atraentes, sejam executadas. Aí surgem as desculpas: “esse serviço é importante para mim”, “é o único jeito de eu me comunicar”, ou ainda, “eu não tenho nada a esconder”. Será que não tem mesmo? Imagine alguém de posse de todos os seus dados. Documentos de identificação, endereço, etc. Ele pode se passar por você e lhe causar grandes transtornos. Ele pode fornecer seus dados a criminosos que podem organizar, desde golpes pequenos, até sequestros. Ainda há o problema das informações voluntariadas a empresas de tecnologia. É o mesmo caso das empresas relatado acima. Alguém que possua tanta informação pessoal sobre tanta gente, pode manipular mercados, sociedades, eleições, etc.

Integridade

Imagine se alguém for capaz de destruir os dados de seu computador. Você teria como recuperá-los? Isso vale para empresas, profissionais de vários setores, instituições de pesquisa e para o cidadão comum. Imagine se seu médico perder todos os dados daquele longo tratamento que você está fazendo. Imagine se alguém for capaz de alterar resultados de seus exames.

Um crime crescente, hoje em dia, é o sequestro de dados. O computador da vítima é comprometido e seus dados são criptografados, ficando inacessíveis. Os criminosos exigem uma quantia para liberar a chave criptográfica que retornaria o acesso aos dados à vítima. Em muitos casos, não pagar significa perder aqueles dados permanentemente. Pagar, não é garantia de nada. Lembre-se, são criminosos.

Disponibilidade

O sistema caiu. E agora? Você não odeia quando isso acontece com você? Seja na fila do caixa ou na biblioteca, não importa. Esperamos que os sistemas estejam disponíveis o tempo todo. Afinal, imagine se seus dados de comprovantes para o Imposto de Renda ficam indisponíveis, justamente no dia em que você vai preencher a declaração (normalmente, no último dia possível). Imagine se os dados de uma compra grande de um cliente seu ficam indisponíveis, justamente no momento de fechar um grande negócio.

Tudo isso pode ser evitado

Em primeiro lugar, não existe solução de segurança 100% eficaz. Mas é possível chegar perto. O que pode ser feito:

  • Blindagem do sistema operacional de seu computador.

Se você usa um sistema operacional proprietário, talvez fosse interessante substituí-lo por um livre. Só assim é possível garantir a segurança de seu sistema, sem ter que confiar cegamente em uma empresa estrangeira. No caso de sistemas livres, é possível modificar seu núcleo (o componente principal de um sistema operacional) para que se tornem bastante seguros. Com isso, é possível praticamente eliminar (mas não totalmente) o risco de invasões, vírus, cavalos de Troia e várias outras ameaças à privacidade e à integridade dos dados.

  • Proteção da rede.

É essencial um firewall instalado e bem configurado. Isso previne acessos indevidos e roubo de informações. É possível também, em situações mais críticas, instalar Sistemas de Detecção de Invasão (IDS, em inglês). São ferramentas que permitem reconhecer ataques e reagir adequadamente a eles. É importante tornar obrigatório o uso de conexões “seguras”, usando criptografia.

  • Proteção dos dados.

A criptografia também pode ser usada para impedir que, uma vez roubados, os dados sejam legíveis por outros. Informações sensíveis sempre deveriam ser criptografadas para seu armazenamento mas, principalmente, em sua transmissão. Com a criptografia adequada, é seguro fazer cópias de segurança (backups) de seus dados em mídias inseguras, como DVDs, HDs externos, ou fitas digitais.

  • Educação em segurança.

Este é, talvez, o item principal. Não adianta instalar o sistema mais moderno e seguro do planeta e região, se os usuários não souberem se comportar de maneira segura. Um único usuário displicente pode comprometer toda a segurança de um sistema. Empresas e instituições deveriam investir no treinamento de seu pessoal, para que tenham o comportamento adequado. Isso envolve a conscientização da necessidade de boas senhas (e o que é uma boa senha), o armazenamento destas informações (não guarde as senhas em uma planilha eletrônica ao alcance de todos, ou deixe no postite grudado no monitor), a atenção a técnicas de engenharia social (a mais eficaz das técnicas: se você quer saber a senha de alguém, pergunte – se fizer direitinho, a pessoa vai dizer), enfim, envolve uma mudança de comportamento.

Hoje, entregamos nossas vidas aos computadores. Então, cabe a pergunta: você tem zelado por sua segurança?


Imagem destacada: adaptação de xfce-system-lock, ícone do pacote Tango.

Estatística e a expansão de gases

E se todas as moléculas de oxigênio presentes no ar de uma sala fossem, ao mesmo tempo, se amontoar em um canto e lá ficassem? Morreríamos sufocados. Não há lei da mecânica que proíba um tal conluio de moléculas. Se é assim, por que isso não acontece? A curiosa resposta para isso é que é pouco provável que aconteça. Para nos convencermos disso, quero propor uma espécie de jogo.

O jogo envolve dois dados de seis faces e onze cartões, que podem ser facilmente confeccionados em papel. É uma adaptação de um modelo chamado Urna de Ehrenfest, que visa explicar a expansão de gases, do ponto de vista da mecânica estatística.

Antes, um pouco sobre as hipóteses. O gás é modelado como uma coleção imensa de partículas em uma quantidade fixa, que não interagem entre si, dentro de um compartimento isolado do resto do universo (mecanicamente e energeticamente), que é imensamente maior do que o volume total das partículas (a soma do volume de todas as partículas). Em uma tal situação, as partículas têm uma distribuição de velocidades, que depende da temperatura do sistema, mas cuja forma é bem definida. É conhecida como a distribuição de Maxwell-Boltzmann. A forma exata desta distribuição não será importante aqui. O que importa é que há muitas partículas com energia de movimento próxima à média e, à medida que vamos nos afastando desta média, encontramos cada vez menos partículas. Assim, há poucas partículas muito energéticas e poucas partículas “lentas”, se comparadas ao valor médio.

Vamos ao jogo. Tome os onze pedaços de papel e numere-os de 2 a 12. Divida a mesa (ou qualquer apoio que esteja à sua frente) em duas partes e coloque todos os cartões em um dos lados. O que vamos simular é a situação em que um gás esteja, inicialmente, em um compartimento e uma passagem seja aberta, permitindo que ele se expanda para outro compartimento idêntico. Os números representarão (muito aproximadamente – isso é apenas uma experiência didática) o nível de energia das partículas. Jogue os dois dados e some os valores obtidos. Será um valor de 2 a 12. Encontre o cartão com aquele número e troque-o de lado. Repita este procedimento até não ser mais divertido (ou umas vinte vezes, o que for maior). Conte quantos cartões há em cada lado. Se quiser, pode continuar mais algumas vezes e voltar a contar o número de cartões em cada lado. Se os dados não são viciados, o número de cartões deve flutuar em torno da metade, em cada lado. Aqui, os dados servem para modelar a hipótese de que existe uma probabilidade de uma partícula passar de um compartimento para outro. No final, o gás ocupa os dois compartimentos, aproximadamente da mesma maneira.

Vamos aos detalhes. E aquela história de distribuição de velocidades? Isso foi representado pelo fato de termos dois dados. Em uma jogada de um dado não viciado, a probabilidade de sair uma face específica é de uma em seis. Para termos o resultado 2, os dois dados têm de fornecer a face 1, o que dá uma chance de 1 em 36. O mesmo ocorre para o 12; a única possibilidade é que os dois dados forneçam 6. Para termos o resultado 3, pode ser que tenhamos 1 no primeiro dado e 2 no segundo, ou o contrário. Então, são duas possibilidades em 36. O mesmo ocorre com o 11: podemos obtê-lo com 5 e 6, ou com 6 e 5. Seguindo este raciocínio, o valor com maior probabilidade de sair é 7. Há seis maneiras de conseguirmos este resultado, o que fornece uma probabilidade de 6 em 36. Assim, há seis vezes mais chances de obtermos o resultado 7, do que 2, por exemplo.

Uma nota de cautela. Para um dado não viciado, a probabilidade de sair uma face específica em uma jogada é de um sexto. Isso significa que, se jogarmos esse dado um número imenso de vezes, esperamos que a frequência com que essa face saia seja próxima ao valor da probabilidade dito antes (um sexto). É assim que sabemos que o dado não é viciado. Se a frequência das faces for diferente de um sexto cada, o dado é viciado. O leitor atento (ou com formação em matemática) deve ter se revoltado com a circularidade desta “definição”. Isso porque esta não é uma definição. É apenas uma argumentação de cunho prático. Há uma linda discussão sobre as interpretações do conceito de probabilidade em termos de frequências de ocorrência ou de possibilidade (ou tendência) de ocorrência que, infelizmente, não cabe aqui. O que importa para nós é que existe um sistema mecânico (o dado não viciado) que é capaz de fornecer uma saída aleatória com a distribuição de probabilidades que desejamos (note que esta não é, nem de longe, a distribuição de Maxwell-Boltzmann – isso é só um jogo). Poderíamos muito bem usar, como fonte de números aleatórios, outros sistemas. Um computador moderno pode produzir números aleatórios verdadeiros (não os pseudo-aleatórios), que servem bem à nossa proposta. Você pode modificar o jogo como quiser.

Ao executar o jogo, é possível perceber que o gás ocupa os dois recipientes porque esta é a situação mais provável. A explicação da termodinâmica estatística para a expansão de gases perfeitos é obtida pela contagem dos possíveis estados e determinando-se, assim, o mais provável. Isso requer que o sistema esteja em equilíbrio, ou seja, já “acomodado”. O jogo aqui descrito não requer esta hipótese: é um modelo dinâmico por natureza (evolui fora do equilíbrio).

Divirtam-se.

Respostas Científicas

particulas_capa5No artigo inaugural deste espaço, gostaria de falar um pouco sobre o tipo de respostas que a ciência pode nos dar. Se você já leu em algum lugar, algo do tipo – “cientistas provaram que…” – está errado. Engana-se quem acha que a ciência prova coisas sobre o mundo. O método científico não foi feito para isso. O que a ciência pode fazer por você é fornecer uma explicação plausível, que possa ser usada com confiança para predizer o comportamento das entidades do universo.

Assim, começa-se com uma hipótese. Essa hipótese deve ser falsificável, ou seja, ela não pode ser trivialmente verdadeira ou impossível de ser rejeitada. Se ela for impossível de ser rejeitada, nenhum conhecimento é ganho com sua confirmação – não é assim que se faz ciência. Uma vez que se determine que ela pode ser rejeitada, então experimentos são elaborados para testá-la. Pode acontecer que os dados experimentais contrariem a hipótese. Ganhamos conhecimento, pois agora sabemos que, o que quer que você tenha modelado, não funciona de acordo com aquela hipótese. Você pode tentar outras e repetir o processo. Pode acontecer que,  com os dados experimentais obtidos, não seja possível rejeitar a hipótese. Usando técnicas adequadas para a elaboração do experimento e para o tratamento dos dados, chega-se à conclusão de que a hipótese não pode ser rejeitada com um certo grau de confiança. A estatística é ferramenta fundamental para isso. Para altos valores de confiança, podemos dizer que os dados confirmam, corroboram, ou dão suporte à hipótese. Isso significa que a hipótese funciona relativamente bem, para aquele conjunto de dados. É óbvio, a partir destas considerações, que o experimento não provou nada. Apenas informa que há evidências a favor da hipótese.

Com mais experimentos semelhantes, é possível aumentar esse grau de confiança. A hipótese também deve gerar consequências, ou seja, predizer fenômenos, que devem ser falsificáveis e, portanto, permitir que outros experimentos sejam propostos e executados.

Em um dado momento, haverá tanta confiança na veracidade da hipótese, que podemos tratá-la como “verdadeira”. É como um crime que ninguém viu ser cometido. Se há uma quantidade enorme de evidências contra um único suspeito, ele será condenado.

Assim nascem as teorias científicas. Coleções de hipóteses, muitas vezes refinadas por novos dados experimentais, que passaram pelos testes de rejeição e nos informam como o mundo funciona, com bastante segurança. Nunca com absoluta certeza, mas com muita confiança. É assim com a gravitação de Einstein, com a teoria do Big-Bang, com a mecânica quântica, com a evolução por seleção de Darwin, etc. São “apenas teorias”, que não são capazes de provar nada, mas passaram pelo teste das eras e nos dão ampla confiança de que é assim que o universo funciona.

Educar-se em ciência permite que se mergulhe no universo e que se veja suas entranhas com os próprios olhos, sem a ilusão de que eles sempre capturam a verdade absoluta.