quinta-feira, 19 de agosto de 2010

O conhecimento comum e o equilíbrio de Nash

O conceito do conhecimento comum é a base na teoria dos jogos. A clássica teoria dos jogos assume que todo conhecimento é "conhecimento comum", exceto por partes específicas de informações que são percebidas assimetricamente, para justificar o conceito do equilíbrio de Nash. Um fato é de conhecimento comum se todos sabem o fato, todos sabem que todos sabem o fato, todos sabem que todos sabem que todos sabem o fato, e assim infinitamente. Se é de conhecimento comum que todos os jogadores são racionais, ou escolhem a melhor reação, então em condições apropriadas eles produzem um equilíbrio de Nash.

Por vários anos foi pensado que a existência de conhecimento comum da racionalidade para os jogadores no jogo era fundamental. Acontece que em um jogo com dois jogadores o conhecimento comum da racionalidade não é necessário como uma condição para estratégias que levem ao equilíbrio de Nash. Um exemplo é o dilema do prisioneiro, onde a pior estratégia para ambos conduz a um melhor resultado cooperativo, um equilíbrio de Nash.

Dilema do prisioneiro:

Dois suspeitos, A e B, são presos pela polícia. A polícia tem provas insuficientes para os condenar, mas, separando os prisioneiros, oferece a ambos o mesmo acordo: se um dos prisioneiros, confessando, testemunhar contra o outro e esse outro permanecer em silêncio, o que confessou sai livre enquanto o cúmplice silencioso cumpre 10 anos de sentença. Se ambos ficarem em silêncio, a polícia só pode condená-los a 6 meses de cadeia cada um. Se ambos traírem o comparsa, cada um leva 5 anos de cadeia. Cada prisioneiro faz a sua decisão sem saber que decisão o outro vai tomar, e nenhum tem certeza da decisão do outro. A questão que o dilema propõe é: o que vai acontecer? Como o prisioneiro vai reagir?

Existem alguns jogos divertidos que possuem equilíbrios de Nash que dependem do nível de recursão de "quem sabe de quem sabe o que". Os próximos problemas exploram este assunto.

O pai e os filhos:

Um pai honesto mas brincalhão disse a seus dois filhos responsáveis que ele colocou R$ 10, R$ 100, R$ 1.000 ou R$ 10.000, com igual probabilidade, em um envelope e dez vezes o tal dinheiro em outro envelope. Ele deu um envelope para cada filho. Um filho encontrou R$ 10.000 e o segundo R$ 1.000. O pai chamou cada um a parte e perguntou particularmente se ele gostaria de trocar. Cada um disse "sim". O pai relatou cada uma destas respostas para o outro irmão. Quantas vezes precisará o pai repetir este processo até que um dos filhos diga "não"?

As mulheres de Sevita:

Os Sevitãos vivem como famílias monogâmicas em um pequeno vilarejo onde literalmente todos sabem o que todos estão fazendo, literalmente em todo o tempo. A única assimetria informacional é que nenhuma esposa sabe se seu próprio marido é mulherengo, embora toda esposa saiba a conduta de todos os outros maridos no vilarejo. A punição para um marido mulherengo é ser marcado pela sua esposa com um M marrom na testa durante à noite enquanto dorme. Esta punição é somente imposta pela esposa que soube com convicção que seu marido é culpado.

Desnecessário anunciar, nenhum marido jamais foi marcado. Mas um dia uma mulher de outro vilarejo fez uma visita. Indo embora no dia seguinte, ela confidenciou para as mulheres de Sevita que agora há pelo menos um mulherengo no vilarejo. Nada aconteceu durante cinco dias. Mas na sexta noite um certo número de maridos foram marcados com o M marrom. Quantos maridos foram marcados? Quantos maridos mulherengos há neste lugar? Como pode isto acontecer, já que a mulher indo embora não disse para as mulheres de Sevita nada que elas já não saibam - que agora há pelo menos um mulherengo no meio delas?

O problema da Cor dos Olhos postado neste blog também é sobre este assunto (http://dan-scientia.blogspot.com/2009/08/problema-de-logica-cor-dos-olhos.html).

sábado, 14 de agosto de 2010

Corrida de Vetores

A corrida de vetores é um jogo de papel e caneta de origem desconhecida e que pode ser jogado por dois ou mais jogadores. Para este jogo utiliza-se um papel quadriculado, preferencialmente com os quadradinhos da grade possuindo 5 milímetros de dimensão, e contendo um desenho imitando um circuito de Fórmula 1. Este jogo simula uma corrida de carro.

Na corrida de vetores cada carro é representado por um vetor. Os vetores indicam a aceleração, a direção e a posição do carro (na ponta da seta). Os carros sempre devem ficar na interseção das linhas do quadriculado e não no interior de um quadradinho.

Durante cada movimento um carro pode deslocar-se no mesmo número de quadradinhos e direção do movimento anterior ou, pode deslocar-se para um dos pontos ao redor desta projeção do movimento anterior. A escolha entre pontos próximos fará com que diminua o vetor e consequentemente reduza a velocidade do carro e a escolha entre pontos mais distantes aumentará o vetor e a velocidade do carro. A direção também pode ser alterada com a escolha de pontos laterais ao ponto central da projeção.

O deslocamento do carro se dá nesta sucessão de vetores ligados e a posição atual do carro estará na extremidade do último vetor adicionado. A figura abaixo ilustra o deslocamento do carro partindo do repouso, cada círculo indica um ponto para onde o carro pode deslocar-se e a linha tracejada é a projeção do movimento anterior, que marca o ponto central dos nove pontos permitidos para o deslocamento.


Semelhante a uma corrida real onde os carros devem respeitar o posicionamento e a desaceleração, para realizarem uma curva com um bom aproveitamento, neste jogo os vetores devem seguir esta mesma destreza nos movimentos dos carros. Desta forma, os jogadores devem planejar cada movimento, prevendo os próximos para que seu carro não saia da pista. O percurso formado por esta sucessão de vetores é semelhante a um percurso de um carro em uma corrida real.

Toda mudança de direção ou de velocidade ocorre com uma mesma taxa de variação que é, durante cada rodada, um quadradinho por vez. Assim, por exemplo um vetor com cinco quadradinhos de comprimento precisará de 4 rodadas para reduzir seu comprimento à um quadradinho apenas.

Para realizar o jogo deve-se então ter uma folha de papel quadriculado e uma caneta, ou canetas de cores distintas para cada participante. Nesta folha faz-se um desenho de uma pista de fórmula 1 com a linha de largada e chegada. A largura da pista deve comportar o número de jogadores lado a lado, seis quadradinhos de largura é uma boa medida. Após a definição da ordem dos jogadores, cada jogador marca o seu ponto inicial sobre a linha de largada. Se houver mais jogadores que o espaço disponível na linha de largada, pode-se usar as linhas de trás. Seguindo a ordem dos jogadores, a cada rodada cada jogador marca o seu vetor e assim sucessivamente até que todos completem a volta na pista. A classificação final é de acordo com a ordem de chegada ou pode-se definir o vencedor aquele que, após terminada toda a rodada, tiver passado a linha de chegada com maior distância.

Durante o percurso dois carros não podem estar sobre um mesmo ponto, deve-se escolher um ponto livre, dentro da pista e a reta do vetor não pode passar fora da pista. É permitido ocupar um ponto que já foi ocupado por outro jogador em uma rodada anterior e os vetores podem cruzar-se.

Dependendo da situação, pode ocorrer do jogador não ter um ponto livre dentro da pista, seja por ter suas opções já ocupadas pelos outros jogadores ou seja por estar em uma velocidade que não permita reduzir a tempo e por exemplo realizar uma curva. Para estas situações existem diversas regras que devem ser combinadas pelos jogadores. Existe definir que o jogador não poderá realizar a jogada e na próxima deverá reiniciar sua velocidade do zero, ou realizar a jogada colidindo com outro jogador ou saindo da pista e reiniciar sua velocidade do zero. Pode-se ainda aplicar punições como por exemplo ficar uma rodada sem jogar e o deslocamento fora da pista deve ser de um em um quadradinho. O jogador vítima da colisão normalmente segue sua jogada normalmente. Tudo é combinado antes da corrida.


Se quiser jogar no computador existe um site que possui uma versão em Java deste jogo, chama-se Vector Racer (http://vectorracer.boschloo.net/).

terça-feira, 10 de agosto de 2010

A tecnologia RAID

O RAID, atualmente um acrônimo para "Redundant Array of Independent Disks" ou "Arranjo Redundante de Discos Independentes", é uma tecnologia usada para proporcionar confiança e redundância de dados e aumentar a performance. Trata-se de uma tecnologia que combina dois ou mais discos rígidos para formar um único volume de armazenamento, ou seja, é um conjunto de discos que funcionam como se fossem somente um. Pode ser implementado via hardware ou software e possui diversos níveis de combinação em diversos arranjos.

Alguns arranjos RAID proporcionam uma alta performance pois múltiplos discos podem ser acessados simultaneamente e outros arranjos RAID proporcionam proteção de dados com espelhamento de discos ou cálculo de paridade.

Um RAID por hardware requer uma placa controladora, normalmente com tecnologia única para cada fabricante. Na implementação em hardware os discos físicos ficam transparentes para o sistema operacional e o sistema enxerga somente um único volume de armazenamento. A maioria das implementações em hardware suportam o "hot swapping", permitindo que discos com falha sejam substituídos enquanto o sistema está sendo executado.

Um RAID por software é criado com a combinação de partições e discos no ambiente do sistema operacional. Não é necessária uma placa controladora porém o processamento fica dependente do processador da máquina.

Os diferentes arranjos RAID são nomeados com a palavra RAID seguida de um número, por exemplo RAID 0, RAID 1, que indica seu nível. Os níveis RAID padronizados formam o conjunto básico de arranjos RAID e empregam a segmentação, o espelhamento ou a paridade. O RAID padrão utiliza a numeração de 0 a 6. Ainda existem implementações RAID não padronizadas e também implementações híbridas ou combinadas, por exemplo o RAID 0+1.

O RAID 0 não é verdadeiramente um RAID pois não oferece redundância, apenas distribui os dados entre os discos. Os dados são divididos em pequenos segmentos e distribuídos entre os discos. A vantagem é ter um aumento na performance e ter fácil implementação. A desvantagem é justamente a não redundância, isto é, não oferece a tolerância a falha, os dados armazenados não podem ser recuperados em caso de falha em um disco. É recomendado para edição de áudio e vídeo, servidor web e design gráfico. Necessita de pelo menos dois discos.


O RAID 1 cria um espelhamento dos dados em dois ou mais discos. É bastante útil quando a confiança é mais importante do que a capacidade de armazenamento. A vantagem são os 100% de redundância que aumentam geometricamente com a adição de novos discos. A desvantagem é que a capacidade de armazenamento cai para pelo menos a metade. É recomendado para aplicações financeiras e servidores de banco de dados pequenos. Necessita de pelo menos dois discos.


O RAID 2 implementa um mecanismo de detecção de falhas em discos rígidos, assim todos os discos ficam monitorados pelo mecanismo. Atualmente é pouco usado pois praticamente todos os discos rígidos novos já incluem mecanismos de detecção de falhas e então não há aplicação comercial para o RAID 2.

O RAID 3 e o RAID 4 distribuem os dados segmentados entre os discos e adotam um disco dedicado para paridade, proporcionando a redundância. O RAID 3 usa a segmentação em bytes enquanto o RAID 4 usa em blocos. Ambos RAID 3 e RAID 4 foram rapidamente substituídos no mercado pelo RAID 5. Necessitam de pelo menos três discos.


O RAID 5 usa a segmentação em blocos para distribuir os dados e possui a paridade dos dados também distribuída entre os discos. Tem a vantagem de usar o mínimo de sobrecarga no acesso de leitura aos discos e possibilita um melhor aproveitamento do espaço de armazenamento quando comparado ao RAID 1, ou seja, um menor custo para a redundância. A desvantagem está na performance ruim na escrita devido ao controle de paridade. É recomendado para servidores de arquivo e de aplicação, servidores de banco de dados e servidores web, e-mail e intranet. Necessita de pelo menos três discos.


O RAID 6 extende o RAID 5 com uma paridade adicional, da mesma forma segmenta os dados em blocos entretanto implementa dois blocos de paridade, distribuídos entre os discos. A vantagem está numa melhor redundância quando implementado em um número alto de discos utilizados pois pode tolerar falhas em mais de um disco simultaneamente. A desvantagem está na perda de performance na escrita. Necessita de pelo menos quatro discos.


O RAID 0+1 é uma combinação do RAID 0 com o RAID 1, onde os dados são segmentados entre os discos para melhorar a performance mas também utiliza o espelhamento de disco para a redundância. A vantagem está nas altas taxas de transferências de dados aliada a pelo menos 100% de redundância. A desvantagem é possuir um custo maior e escalabilidade limitada inerente ao alto custo. É recomendado a servidores de banco de dados que requerem alta performance e tolerância a falhas. Outra combinação é o RAID 1+0. A diferença está na localização de cada sistema RAID, o RAID 0+1 é um espelhamento da segmentação enquanto o RAID 1+0 é uma segmentação de espelhos. Necessitam de pelo menos quatro discos.


Existem muitos outros níveis, por exemplo RAID 0+3 e 3+0, RAID 1+0+0, RAID 5+0 e 0+5, RAID 5+1, que são justamente combinações entre os diversos padrões RAID para ganhar performance e ou redundância adicional.

É necessário um artigo específico para descrever as características, vantagens e desvantagens para cada nível de RAID, este artigo foi apenas uma introdução.

Neologismo na computação

Chama-se de neologismo a criação de novas palavras na língua ou atribuição de novos sentidos a palavras já existentes. No mundo da computação o neologismo ocorre com uma grande frequência. Estas palavras surgem para suprir uma necessidade vocabular, que pode ser momentânea mas às vezes, quando muito utilizada, acaba se estabelecendo no idioma e se torna parte do léxico.

Como exemplos de neologismos na computação, temos: salvar, escanear, logar, deslogar, ripar, ressetar, rebootar etc. Geralmente são palavras da língua inglesa que são pronunciadas e escritas de uma forma aportuguesada.

Em muitos casos a expressão já possui uma tradução para a língua portuguesa e o uso destas palavras acaba sendo um erro. Por exemplo dizer "embedar" em vez de "incorporar", "downloadar" em vez de "baixar", "printar" em vez de "imprimir", "setar" em vez de "configurar" e "atachar" em vez de "anexar" passa a ser um atentado à língua portuguesa.

Embora existam palavras que estão incorporadas no léxico, algumas devem ser evitadas, são os casos de "customizar" pois deve ser usado "personalizar", "deletar" pois deve ser usado "apagar" e "estartar" pois deve ser usado "iniciar".

Atualmente a moda é dizer "googar" e "tuitar", são tecnologias na Internet com grande popularidade. Tudo quanto é novidade acaba formando um neologismo, isto é característica de uma língua viva. Há até um website norte-americano, o "Word Spy" (http://wordspy.com/), que mantém um guia para estas novas palavras.

sexta-feira, 6 de agosto de 2010

Problema de Lógica: Letras na resposta

Atenção, resposta logo após o problema!

Quantas letras existem na sua resposta a esta pergunta?





RESPOSTA





Cinco

quinta-feira, 5 de agosto de 2010

Copiando arquivos pela rede em modo texto

Em sistemas Linux podemos copiar arquivos entre máquinas de uma rede utilizando uma ferramenta do pacote OpenSSH. O OpenSSH é uma versão gratuita das ferramentas de conectividade SSH. O OpenSSH codifica todo o tráfego para eliminar qualquer ataque de escuta ou rapto de conexão. A suíte OpenSSH traz soluções que substituem o rlogin, telnet, ftp e o rcp.

A ferramenta para cópia remota e segura de arquivos é o scp (secure copy). O scp copia arquivos entre máquinas em uma rede usando a mesma autenticação e segurança da ferramenta ssh. São permitidas cópias entre uma máquina local e uma remota ou entre duas máquinas remotas. Para que o scp funcione é necessário que a máquina remota tenha o servidor sshd ativo.

A sintaxe básica e resumida do comando está na linha abaixo:

scp [-Cr] [-P porta] [[usuario@]host1:]arquivo1 ... [[usuario@]host2:]arquivo2

Um exemplo é:

scp joao@192.168.0.105:/home/joao/arquivo.ext /home/maria/

O comando acima copia o arquivo.ext da máquina remota no endereço 192.168.0.105, usando a conta do usuário joao, para a máquina local, de onde está sendo executado o comando. Se a conta do usuário joao tiver uma senha então será solicitada para autorizar a cópia.

Existem diversas opções para a linha de comando, citei apenas a "-C" que ativa a compactação para a transferência, a "-r" que copia recursivamente um diretório e "-P porta" para caso a porta não seja a padrão. A página manual traz uma descrição de todas as opções.

A velocidade da cópia obviamente depende da estrutura da rede. Em uma rede de 100 Mbits a velocidade máxima teórica é 12,5 MB/s.

Mais informações em: http://www.openssh.org/

quarta-feira, 4 de agosto de 2010

Informações nos arquivos MP3

O ID3 é um formato muito popular de etiqueta de identificação para arquivos de áudio. Uma etiqueta ID3 é um recipiente de dados anexado em um arquivo MP3, somente MP3. Pode armazenar informações relevantes à música contida no próprio arquivo, como o nome da música, do compositor, do disco, o gênero, o ano e até uma imagem com a capa do disco.

Diversos softwares como iTunes, Windows Media Player, WinAmp e hardwares "MP3 players" como o iPod, aparelhos de DVD e de som automotivo suportam a etiqueta ID3. Assim, quando um arquivo MP3 é reproduzido nestes equipamentos, as informações são mostradas no visor.

Para inserir estas informações no arquivo MP3 é necessário um editor de etiqueta ID3, por exemplo o EasyTAG (http://easytag.sourceforge.net/). Alguns softwares multimídia também trazem este recurso de edição da etiqueta, por exemplo o iTunes e o WinAmp.

Os programas que convertem as faixas de CD de áudio para arquivos MP3 costumam automatizar este processo. Existem servidores na Internet que fornecem o CDDB (Compact Disc Database), ou Banco de Dados do Disco Compacto, e o programa de conversão identifica o CD e acessa o banco para preencher a etiqueta com as informações armazenadas no CDDB.

A versão mais recente da etiqueta ID3 é a 2 (ID3v2). Nesta versão, as informações ficam armazenadas no início do arquivo MP3. Cada campo da etiqueta pode armazenar 16 MB e a capacidade total da etiqueta é 256 MB. Na primeira versão do ID3 (ID3v1) a etiqueta ficava nos últimos 128 bytes do arquivo MP3 e cada campo podia armazenar no máximo 30 caracteres.

É possível manter as duas versões de etiqueta no mesmo arquivo MP3. Isto ajuda na compatibilidade com os diversos tocadores pois nem todos suportam a versão 2. Entretanto a versão 2 pode conter dezenas de campos enquanto a versão 1 contém apenas seis. Desta forma as informações podem ficar incompletas quando for utilizada a primeira versão.

Vale a pena manter sua coleção de MP3 com as etiquetas devidamente preenchidas. Pelo menos as informações básicas como nome do disco, nome da música, nome do artista, ano, número da faixa, gênero e uma imagem da capa do disco. Os tocadores mostrarão as músicas em uma forma organizada e especialmente no iPod, que é capaz de mostrar a capa do disco, sua coleção terá um visual incrível.

Mais informações em http://www.id3.org/