domingo, 28 de agosto de 2011

Problema de Lógica: Quantos ovos na granja?

Um granjeiro, ao ser perguntado quantos ovos as galinhas haviam posto naquele dia, respondeu: Não sei, mas, contando de dois em dois, sobra um; contando de três em três, sobra um; contando de cinco em cinco, sobra um; porém, contando de sete em sete não sobra nenhum. Qual o menor número possível de ovos que as galinhas haviam posto?





RESPOSTA





O número não é múltiplo de dois, de três ou de cinco mas é múltiplo de sete.

Os múltiplos de sete são 7, 14, 21, 28, 35, 42, 49, 56, 63, 70, 77, 84, 91, 98, 105, 112, 119 ...

Como não é múltiplo de dois então os números pares estão fora, como não é múltiplo de três então os números 21, 63 e 105 estão fora, e como não é múltiplo de cinco então os números 35 e 70 estão fora. Restaram os números 7, 49, 77, 91, 119 (...).

Destes, os números 7, 49 e 77, se contar de cinco em cinco sobram 2, 4 e 2 respectivamente, portanto o menor número possível de ovos é 91 (2 x 45 + 1; 3 x 30 + 1; 5 x 18 + 1; 7 x 13).

domingo, 7 de agosto de 2011

Emulando o CP 400 no MESS

O CP 400 foi um computador pessoal, pra uso doméstico, produzido no Brasil na década de 1980 pela Prológica. Era compatível com o TRS-80 Color Computer da Tandy RadioShack.

A segunda versão, o CP 400 Color II, lançado no final de 1985, possuía como características técnicas um microprocessador Motorola 6809E com estrutura interna de 16 bits e externa de 8 bits, frequência de clock de 1,6 MHz, ROM de 16 Kbytes com programa monitor e interpretador Basic, RAM total de 64 Kbytes e vídeo no modo texto de 16 linhas por 32 colunas e no modo gráfico com resolução de 49152 pontos (256x192).

O CP 400 Color II tinha um teclado com 59 teclas tipo ASCII incorporado ao gabinete, uma saída de RF para ligação a uma TV e saída para monitor de vídeo composto. Além de saídas para joysticks, porta serial, porta para gravador cassete e suportava cartuchos e controlador de disquetes de 5 1/4.

Computador CP 400 Color II

Sua produção durou pouco devido a chegada do MSX, foi encerrada em 1987, entretanto a diversidade de aplicativos e jogos foi grande. Diversas empresas importaram os jogos do TRS-80 e comercializaram aqui no Brasil, com isso era fácil encontrar cópias "alternativas" dos programas.

Hoje, 26 anos depois, podemos utilizar os softwares emuladores para reproduzir o ambiente do CP 400 e assim executar os jogos que foram sucesso na época. Um emulador bem interessante é o MESS (http://www.mess.org/). O MESS é capaz de emular muitos consoles de jogos e sistemas de computador. Este artigo descreve o uso do MESS no sistema Linux.

Para que um emulador consiga reproduzir o ambiente de um computador antigo, são necessários basicamente dois itens, uma ROM da máquina real e um arquivo imagem de algum dispositivo de armazenamento que o computador antigo suportava, contendo os programas que deseja executar.

Estes arquivos, tanto a ROM quanto imagens de programas, são facilmente encontrados pela Internet. Para o CP 400 Color II, os arquivos com as ROMs são cp400bas.rom e cp400dsk.rom, ou, pode utilizar as ROMs do seu equivalente, o TRS-80 Color Computer II (CoCo2), os arquivos com as ROMs são bas12.rom, disk11.rom e extbas11.rom. Procure na Internet e acesse o site "Programas para o CP-400 Color" (http://sites.mpc.com.br/ric/cp400/cocomain.htm).

Estes arquivos de ROMs são a reprodução da BIOS da máquina real. Na instalação do MESS em um sistema Linux, os arquivos .rom devem ficar no caminho /usr/share/mess/roms/, em um diretório com um nome que identifique o sistema. Para o CP 400 Color II, os arquivos (cp400bas.rom e cp400dsk.rom) devem ficar em /usr/share/mess/roms/cp400/, e para o TRS-80 Color Computer II, os arquivos (bas12.rom, disk11.rom e extbas11.rom) devem ficar em /usr/share/mess/roms/coco2/.

Feito isso o MESS está pronto para ser executado. A sintaxe da linha de comando do MESS é:

mess [sistema] [mídia] [opções]

Se desejar conhecer as opções de linha de comando, execute o MESS com a opção -showusage. A princípio a opção que pode ser útil é a -window, que ativa o modo de janela, senão o MESS será executado em tela cheia. Para conhecer as mídias suportadas em cada sistema, use a opção -listmedia. Os parâmetros de mídia servem para carregar pela linha de comando alguma imagem de um dispositivo de armazenamento, como por exemplo -flop1 jogos.dsk ou -cass jogos.wav. Um exemplo de comando para execução do MESS, emulando o sistema CP 400:

$ mess cp400 -window

Com a execução do MESS, a tela inicial do sistema emulado aparecerá e a partir daí a operação será específica do sistema emulado, no nosso caso o CP 400 Color II (ou CoCo2). Caso não especifique o sistema pela linha de comando, o MESS exibirá um menu para a escolha, de acordo com as ROMs encontradas em /usr/share/mess/roms/.

Tela inicial do CP 400 Color II

Apesar de ter diversas opções para linha de comando, também é possível operar o MESS através de sua Interface de Usuário (UI). Esta interface é apresentada pressionando a tecla Tab, estando o teclado no modo de emulação parcial. A emulação do teclado pode ser alternada pressionando a tecla ScrLock, entre emulação total e emulação parcial.

Algumas teclas de função no MESS são apresentadas a seguir. Estas teclas só tem efeito com o teclado no modo de emulação parcial. Estas são as tarefas padrões destas teclas, é possível personalizar:

ScrLock     alterna a emulação do teclado;
Tab         acessa a Interface de Usuário;
P           pausa a emulação;
Esc         sai da emulação (MESS).

Para carregar uma imagem de disquete enquanto a emulação está em execução, entre na UI (tecla Tab), escolha o menu File Manager, selecione uma das entradas de disquete e navegue pelo seu HD para encontrar o arquivo imagem. Feito isso a emulação será automaticamente reiniciada com o disquete inserido. No CP 400 e no CoCo2 é possível ter até quatro disquetes inseridos ao mesmo tempo.

As instruções a partir daqui são específicas do sistema operacional do CP 400. São os comandos para o interpretador do CP 400.

Em uma operação com uso de imagens de disquetes, para listar o conteúdo de um disquete usa-se o comando DIR, para carregar o programa usa-se LOAD, LOADM etc., e para executar usa-se o comando EXEC. Exemplo:

DIR

SHENANI  BIN  2 B 13
TREKBOER BIN  2 B 13
SANCTUN  TRD  2 B 13
CALIXTO  TRD  2 B 13
SEAQUEST TRD  2 B 13
OK
LOADM "CALIXTO.TRD"
OK
EXEC

Quando há carregado mais de um disquete, é necessário especificar a unidade, por exemplo DIR 0, DIR 1 lista o conteúdo, LOADM "CALIXTO.TRD:1" carrega o programa da segunda unidade. Veja:

DIR 1

SHENANI  BIN  2 B 13
TREKBOER BIN  2 B 13
SANCTUN  TRD  2 B 13
CALIXTO  TRD  2 B 13
SEAQUEST TRD  2 B 13
OK
LOADM "CALIXTO.TRD:1"
OK
EXEC

Indo além, para apagar, copiar ou renomear um arquivo de programa usa-se KILL, COPY TO ou RENAME TO. Exemplos:

KILL "SHENANI.BIN"

COPY "SHENANI.BIN:1" TO "SHENANI.BIN:0"

RENAME "SANCTUN.TRD" TO "BLKSANC.TRD"

Também pela Internet é possível encontrar alguns documentos para operação do CP 400 Color II (Color Basic, Extended Color Basic e Color Disk Basic). O site "Color Computer stuff" (http://www.cs.unc.edu/~yakowenk/coco.html) é um bom ponto de partida.

Consulte a documentação do MESS para obter mais informações sobre a linha de comando e a interface de usuário.

Jogos do CP 400 Color II

quinta-feira, 4 de agosto de 2011

A Estação Espacial Internacional

Com pouco mais de 417 toneladas, a Estação Espacial Internacional (ISS) orbita a Terra numa altitude entre 278 km e 460 km, viajando em uma velocidade média de 27,7 mil quilômetros por hora, completando 15,7 órbitas por dia. Cada órbita leva 91 minutos. O projeto da ISS iniciou em 1994 o primeiro módulo foi lançado em 1998 pela Rússia.

Atualmente a ISS é composta de 15 módulos pressurizados e uma extensa Estrutura de Pilastras Integradas (ITS) que dá suporte a radiadores, painéis solares, compartimentos de carga despressurizados e outros equipamentos. A energia é fornecida por 16 painéis solares montados na ITS em adição a quatro pequenos painéis nos módulos russos. O último módulo, o décimo sexto, está previsto para ser incorporado em 2012.

O volume pressurizado total, com a combinação de todos os módulos, é atualmente 837 metros cúbicos. Estes módulos incluem laboratórios, compartimentos de ancoragem, câmaras impermeáveis ao ar, ligações e quartos de moradia. Com a adição do último módulo o volume passará a aproximadamente 1000 metros cúbicos.

Para dar um ambiente adequado à tripulação, a ISS conta com um Sistema de Suporte à Vida e Controle Ambiental (ECLSS). É um sistema que proporciona e controla a pressão atmosférica, a detecção e supressão de incêndio, os níveis de oxigênio e o suprimento de água. A prioridade do ECLSS é a atmosfera na ISS mas o sistema também coleta, processa e armazena a água utilizada pela tripulação. O sistema é capaz de reciclar a água usada no chuveiro, banheiro e condensação do ar.

A atmosfera a bordo da ISS é similar a da Terra. A pressão normal na estação é a mesma do nível do mar na Terra. Uma atmosfera como a da Terra oferece maior conforto aos tripulantes e é muito mais segura do que uma atmosfera de oxigênio puro, pois esta eleva o risco de incêndios.

No ambiente da estação espacial, a gravidade é a única força significante agindo nos astronautas e objetos. Em alguns momentos há a percepção de resistência da atmosfera, aceleração e correção da órbita, inclinação, rotação etc.

Por causa da alta velocidade de deslocamento, a ISS está em uma constante queda livre sobre o horizonte. Com isto a tripulação tem uma percepção de ausência de peso, da própria sensação de queda livre, dando o efeito de microgravidade.

Os efeitos adversos mais significantes, de um longo período em baixa gravidade, são atrofia muscular e osteopenia. Outros efeitos significantes incluem a redistribuição dos fluidos, lentidão no sistema cardiovascular, baixa produção de glóbulos vermelhos e enfraquecimento do sistema imunológico. Para prevenir alguns destes efeitos fisiológicos adversos, a estação é equipada com esteiras ergométricas, um dispositivo para exercícios resistidos, que fornece vários tipos de exercícios com peso, e uma bicicleta ergométrica. Cada astronauta realiza duas horas de exercícios por dia.

O fuso horário usado a bordo da ISS é o Tempo Universal Coordenado (UTC). As janelas da ISS são cobertas nas horas noturnas para dar a impressão da escuridão da noite, pois a estação passa, por dia, por 16 eventos de nascer do sol e por do sol.

Durante as visitas das missões espaciais, a tripulação da ISS segue o fuso da missão (MET), que é baseado na hora do lançamento do foguete. Como os períodos de sono entre o UTC e o MET geralmente diferem, a tripulação da ISS precisa ajustar seu sono já antes da missão espacial chegar e retornar ao fuso UTC após os visitantes partirem. Em um dia típico na estação, a tripulação dorme das 21:30 até as 06:00 e trabalha 10 horas nos dias úteis e 5 horas aos sábados.

A maioria dos alimentos para os tripulantes da ISS são armazenados de forma congelada, refrigerada ou enlatada. O cardápio é preparado pelos próprios astronautas, com a ajuda de nutricionistas, antes deles voarem para a estação. Como a sensibilidade do sabor fica reduzida pela redistribuição dos fluidos na cabeça, os alimentos apimentados são os preferidos pela maioria da tripulação. Cada tripulante possui um estoque individual de alimento.

Atualmente, a tripulação da ISS é composta de seis astronautas. A cada expedição enviada à estação, parte dos astronautas são substituídos, enquanto a outra parte fica até a próxima expedição. Nas últimas expedições a tripulação foi substituída de três em três astronautas. O período médio de um tripulante na estação são seis meses.

O propósito da Estação Espacial Internacional é ser um laboratório de pesquisa, observatório e fábrica no espaço. Também é planejada para proporcionar transporte, serviço e base para futuras missões à Lua, Marte e asteroides.

É uma parceria internacional de diversas agências espaciais, com as principais sendo a Administração Nacional do Espaço e da Aeronáutica (NASA), a Agência Espacial Federal Russa (RKA), a Agência Japonesa de Exploração Aeroespacial (JAXA), a Agência Espacial Canadense (CSA) e a Agência Espacial Europeia (ESA).


sábado, 30 de julho de 2011

Quake II no Fedora 15 64 bits

O Quake II é um jogo de tiro em primeira pessoa, desenvolvido pela Id Software, lançado em 1997. A série Quake foi uma grande inovação na época para o gênero de jogos em 3D. Foi um sucesso total.

De lá pra cá, com a popularidade crescente do Linux, foram desenvolvidos alguns "ports" do executável do Quake para o sistema Linux. Assim foi possível jogar sem problemas em uma plataforma além da Microsoft.

Surpreendentemente, até hoje é possível executar o Quake nas máquinas e sistemas atuais. Vou demonstrar o caminho para a instalação do Quake II em um Linux Fedora 15 de 64 bits.

Existe uma equipe denominada LIFLG (Linux Installer For Linux Gamers) com o website no endereço http://www.liflg.org/ que desenvolve instaladores para alguns jogos da plataforma Windows. Dentre eles está o Quake II.

Baixando o arquivo "quake2_3.21-r0.16.1-english.run" e acrescentando alguns arquivos do CD original do Quake II, o jogo estará completo para a execução no sistema Linux.

Este instalador e os executáveis disponibilizados pela LIFLG ainda estão em 32 bits, então para um sistema 64 bits é necessário ter as bibliotecas 32 bits instaladas, em especial o gtk+ 1.2 e o SDL 1.2. No Fedora 15 64 bits os pacotes que fornecem os requisitos são (versões até a data deste artigo):

gtk+-1.2.10-71.fc15.i686
glib-1.2.10-34.fc15.i686
SDL-1.2.14-11.fc15.i686
SDL_gfx-2.0.17-4.fc15.i686
SDL_mixer-1.2.11-5.fc15.i686
SDL_sound-1.0.3-6.fc15.i686
SDL_ttf-2.0.10-2.fc15.i686
libmikmod-3.2.0-12.beta2.fc15.i686
libmodplug-0.8.8.3-3.fc15.i686
physfs-1.0.2-3.fc15.i686
speex-1.2-0.13.rc1.fc15.i686

Instale-os caso não estejam e também suas respectivas dependências se necessário. Com as dependências resolvidas o instalador do Quake II pode ser executado, em uma linha de comando como a seguir:

$ linux32 ./quake2_3.21-r0.16.1-english.run

A ferramenta linux32 é necessária pois o instalador do Quake II da LIFLG não tem suporte nativo 64 bits.

Uma janela do instalador é aberta no ambiente gráfico do X para que especifique os parâmetros da instalação. É possível copiar automaticamente os arquivos do CD original ou, se desejar, copiá-los manualmente depois.

Os arquivos necessários originais do jogo, já em seus respectivos destinos, são:

(digamos que o diretório de instalação seja ~/quake2/ e incluindo os arquivos do update 3.20)

~/quake2/baseq2/pak0.pak
~/quake2/baseq2/pak1.pak
~/quake2/baseq2/pak2.pak
~/quake2/baseq2/players/*/*
~/quake2/baseq2/video/idlog.cin

Com tudo realizado, para iniciar o jogo basta executar o arquivo quake2 ou sdlquake2, a partir do diretório de instalação, ou por algum atalho que porventura tenha sido criado na instalação.


Qualquer dúvida existe uma FAQ no website da LIFLG. Aproveite a nostalgia!

quinta-feira, 21 de julho de 2011

Caracteres especiais na variável de ambiente do proxy

No ambiente do interpretador de comandos do Linux existem variáveis de ambiente que servem para armazenar o endereço do servidor proxy e assim os programas clientes, compatíveis com este recurso, as utilizam como parâmetros de configuração.

No Bash e similares existem as variáveis http_proxy, ftp_proxy, gopher_proxy, wais_proxy e no_proxy. Cada variável serve para determinado protocolo e a variável no_proxy especifica um conjunto de domínios, separados por vírgulas, para onde o proxy não será consultado.

A atribuição de valores para estas variáveis de ambiente por ser feita pelo comando "export http_proxy="http://endereço:porta" ou, se necessitar de autenticação, "export http_proxy="http://usuário:senha@endereço:porta", executado diretamente no prompt do shell ou pelo "/etc/profile" etc.

Nos casos de proxy com autenticação de usuário e senha pode acontecer de existirem caracteres especiais, principalmente na senha, e nestes casos, para que o shell interprete corretamente os valores, pode ser necessário usar os códigos de escape nestes caracteres. Trata-se da codificação por cento para caracteres de escape em URL (http://dan-scientia.blogspot.com/2010/05/codificacao-por-cento-para-caracteres.html).

Por exemplo, uma senha definida como 12@elo/6.c deve ser informada na declaração da variável na forma 12%40elo%2F6%2Ec, assim não haverá problemas na interpretação pelo shell.

quarta-feira, 20 de julho de 2011

Espelhamento de porta para monitoramento do tráfego de rede

Espelhamento de porta é um recurso do switch para enviar uma cópia de cada pacote do tráfego de rede à uma determinada porta do switch. Este recurso é utilizado para monitoramento do tráfego de rede, com ferramentas como tcpdump, wireshark, snort etc.

Este recurso é necessário pois os switches operam na camada de enlace, com uma tabela de encaminhamento, direcionando o tráfego somente para a porta correspondente do endereço MAC de destino, e desta forma, as demais estações conectadas nas outras portas não recebem os pacotes.

O único tráfego que é espalhado para todas as portas é o tráfego de broadcast, multicast com CGMP ou IGMP snooping desativado e unicast desconhecido.

Assim, quando o administrador de rede ou o profissional forense desejar monitorar a comunicação entre duas estações conectadas por um switch, é preciso configurar uma porta do switch para receber o espelhamento do tráfego.

Em sistemas Cisco o espelhamento de porta é geralmente referido como Switched Port Analyzer (SPAN), em switches 3Com é denominado Roving Analysis Port (RAP).

Obs: Alguns switches operam também na camada de rede, utilizando os endereços IP. Este controle de tráfego é uma vantagem para a rede pois não haverá colisões entre os pacotes. O recurso de espelhamento de porta pode ir mais além em switches de alto nível.

sexta-feira, 15 de julho de 2011

Problema de Lógica: O problema dos três marinheiros

Adaptado de "O homem que calculava", capítulo XIX, de Malba Tahan.

Um navio que voltava de Serendibe, trazendo grande partida de especiarias, foi assaltado por violenta tempestade. A embarcação teria sido destruída pela fúria das ondas se não fosse a bravura e o esforço de três marinheiros que, no meio da tormenta, manejaram as velas com extrema perícia.

O comandante, querendo recompensar os denodados marujos, deu-lhes certo número de moedas. Esse número, superior a duzentos, não chegava a trezentos. As moedas foram colocadas numa caixa para que no dia seguinte, por ocasião do desembarque, o almoxarife as repartisse entre os três corajosos marinheiros.

Aconteceu, porém, que, durante a noite, um dos marinheiros acordou, lembrou-se das moedas e pensou: "Será melhor que eu tire a minha parte. Assim não terei ocasião de discutir ou brigar com os meus amigos". E, sem nada dizer aos companheiros, foi, pé ante pé, até onde se achava guardado o dinheiro, dividiu-o em três partes iguais, mas notou que a divisão não era exata e que sobrava uma moeda. "Por causa desta mísera moedinha é capaz de haver amanhã discussão e rixa. O melhor é jogá-la fora." E o marinheiro atirou a moeda ao mar, retirando-se cauteloso. Levava a sua parte e deixava no mesmo lugar a que cabia aos companheiros.

Horas depois o segundo marinheiro teve a mesma ideia. Foi à arca em que se depositara o prêmio coletivo e dividiu-o em três partes iguais. Sobrava uma moeda. Ao marujo, para evitar futuras dúvidas, veio à lembrança atirá-la ao mar. E dali voltou levando consigo a parte a que se julgava com direito.

O terceiro marinheiro, ignorando, por completo, a antecipação dos colegas, teve o mesmo alvitre. Levantou-se de madrugada e foi, pé ante pé, à caixa das moedas. Dividiu as moedas que lá encontrou em três partes iguais; a divisão não foi exata. Sobrou uma moeda. Não querendo complicar o caso, o marujo atirou ao mar a moedinha excedente, retirou a terça parte para si e voltou tranquilo para o seu leito.

No dia seguinte, na ocasião do desembarque, o almoxarife do navio encontrou um punhado de moedas na caixa. Soube que essas moedas pertenciam aos três marinheiros. Dividiu-as em três partes iguais, dando a cada um dos marujos uma dessas partes. Ainda dessa vez a divisão não foi exata. Sobrava uma moeda, que o almoxarife guardou como pagamento do seu trabalho e de sua habilidade. É claro que nenhum dos marinheiros reclamou, pois cada um deles estava convencido de que já havia retirado da caixa a parte que lhe cabia do dinheiro.

Pergunta-se, afinal: Quantas eram as moedas? Quanto recebeu cada um dos marujos?





RESPOSTA





Sejam:

M = total de moedas;
a = parte retirada pelo 1º marujo;
b = parte retirada pelo 2º marujo;
c = parte retirada pelo 3º marujo;
r = restante dividido pelo almoxarife.

Sabemos que o 1º marujo jogou uma moeda fora e dividiu M-1 por 3, logo a = (M-1)/3 ou M = 3a + 1. Ficaram duas partes de a na caixa, ou seja, 2a.

Sabemos que o 2º marujo jogou uma moeda fora e dividiu 2a-1 por 3, logo b = (2a-1)/3 ou 2a = 3b + 1. Ficaram duas partes de b na caixa, ou seja, 2b.

Seguindo este raciocínio, temos:

M = 3a + 1
2a = 3b + 1
2b = 3c + 1
2c = 3r + 1

Assim:

a=((3b + 1)/2)
b=((3c + 1)/2)
c=((3r + 1)/2)

Substituindo em M, o equivalente em a, depois em b e finalmente em c, obtemos:

M = 3a+1
M = 3((3b+1)/2)+1
M = 3((3((3c+1)/2)+1)/2)+1
M = 3((3((3((3r+1)/2)+1)/2)+1)/2)+1

Simplificando, chegamos em:

M = 3((3((((9r+3)/2)+1)/2)+1)/2)+1
M = 3((3(((9r+3+2)/2)/2)+1)/2)+1
M = 3((3((9r+5)/4)+1)/2)+1
M = 3((((27r+15)/4)+1)/2)+1
M = 3(((27r+15+4)/4)/2)+1
M = 3((27r+19)/8)+1
M = ((81r+57)/8)+1
M = (81r+57+8)/8
M = (81r+65)/8

Ou ainda:

M = (80r + r + 64 + 1)/8
M = 10r + r/8 + 8 + 1/8
M = 10r + 8 + (r+1)/8

A expressão mostra que r+1 deve ser múltiplo de 8, para resultar em número inteiro, ou seja, r+1 = 8k. Fazendo r = 8k-1 e substituindo na expressão, teremos:

M = 10(8k-1) + 8 + (8k-1+1)/8
M = 80k - 10 + 8 + k
M = 81k - 2

Na qual o parâmetro k pode receber um número natural qualquer: 1, 2, 3, 4, 5, 6, ...

Os valores de M serão, respectivamente:

79, 160, 241, 322, 403, 484, ...

Como o enunciado afirma que o número de moedas é superior a 200 e que não chega a 300, o valor é 241 pois é o único que serve para o caso.

Então:

241 moedas;
1º marujo = 103; (80 + 23)
2º marujo = 76; (53 + 23)
3º marujo = 58; (35 + 23)
jogadas ao mar = 3;
almoxarife = 1.