O problema do Tiririca nas eleições gerou uma polêmica e tanto. E revelou como as pessoas não entendem o nosso sistema político. Vou complicar, digo, esclarecer a situação.
Digamos que queiras um iPhone de natal. Papai Noel não acha um iPhone para comprar, mas encontra um Motorola F3. Pelo menos é um telefone, que é o que precisavas. Pior teria sido ganhar uma garrafa de whisky, que não gostas.
Pois bem, agora imagina que o Papai Noel só pode comprar um presente para todo mundo. A maior parte das pessoas pede um telefone, mas cada uma pede uma marca ou modelo diferente. Um grupinho pequeno, por outro lado, pede uma mochila das Meninas Superpoderosas. Como não pode agradar a todos os desejos, Papai Noel decide comprar mochilas para todos.
Então, vamos ter todo mundo de mochila cor-de-rosa, quando a maior parte queria mesmo era um telefone. Para isso serve o sistema de lista aberta (o da eleição para o Congresso): que as pessoas ao menos ganhem algo parecido com o que votaram.
Pronto, esta foi minha contribuição para a democracia brasileira. De lambuja, ganhei links para Tiririca e Meninas Superpoderosas no meu blog.
sábado, 30 de outubro de 2010
terça-feira, 26 de outubro de 2010
Anglicismo tupiniquim
Quando escutei minha sogra pronunciar a palavra, soube que o estrago estava feito. Agora vai entrar para o dicionário o tal do anderlaine. Ou será ãderlaine?
Em inglês, o traço baixo chama-se underscore. Ele também é conhecido como understike, low line ou low dash. O anderlaine, portanto, só pode ser invenção local.
E o bom e velho traço baixo entrou para a história. Daqui a vinte anos, quando eu mencionar o traço baixo, meu filho certamente vai rir do meu vocabulário antigo. Não importa, seguirei teimosamente apoiando nossa língua.
Em inglês, o traço baixo chama-se underscore. Ele também é conhecido como understike, low line ou low dash. O anderlaine, portanto, só pode ser invenção local.
E o bom e velho traço baixo entrou para a história. Daqui a vinte anos, quando eu mencionar o traço baixo, meu filho certamente vai rir do meu vocabulário antigo. Não importa, seguirei teimosamente apoiando nossa língua.
domingo, 24 de outubro de 2010
Campeonato mundial de jogos
Os jogos de computador estão ficando realistas demais. Acho que estão deixando de ser jogos para se tornarem simulações. E a criatividade está diminuindo; imagino que os desenvolvedores gastem tanto tempo aperfeiçoando os detalhes e efeitos realistas, que não têm tempo para a criatividade.
Então, proponho separar os jogos por categoria, a fim de realmente aferir a habilidade técnica e a criatividade dos programadores. Eu imaginei algumas e já aproveito para premiar os melhores jogos em cada uma.
A primeira é a Mosca. Nessa categoria, o cidadão tem que ter menos memória que a necessária para armazenar uma tela do jogo, não importa a resolução. E o ganhador é Thrust para o Atari 2600. O Atari tem 128 bytes de memória e os programas normalmente têm 4KB ou menos, mas podem ser maiores se o ROM for paginado (porque o Atari só usava 12 linhas de endereçamento). Esse jogo foi originalmente escrito para o BBC Micro e rodava sobre 32KB. Ele simula a física muito bem e isso já seria impressionante se, adicionalmente, um alemão chamado Thomas Jentzsch não o tivesse portado para o Atari. O jogo, ademais, foi portado apenas em 2000, muito depois do fim do sucesso comercial da plataforma.
A segunda categoria é a Galo. Nessa categoria incluo todos os jogos escrito para micros de 8 bits. Eu escolhi um grande campeão: Elite. Esse jogo necessitava de apenas 32KB e foi uma revolução porque, além dos gráficos em 3D incríveis (com eliminação de faces ocultas), foi dos primeiros a ter conteúdo proceduralmente gerado. O universo de Elite consiste de 8 galáxias com 256 planetas cada uma. O jogo foi planejado com um número muito maior de planetas, mas a editora achou que as pessoas não iam acreditar que um micro de 8 bits pudesse gerar tanta complexidade. Ele foi lançado em 1984 (depois de dois anos de desenvolvimento) e portado para quase todos os micros da época.
A categoria Pena abarca os jogos escritos para micros de 16 bits. E o campeão é o Another World do Amiga. Ele já representa um grande salto em relação aos jogos de 8 bits, porque o Amiga tinha hardware gráfico avançado e muito mais memória (512KB, pelo menos). A grande inovação foi o uso de efeitos cinematográficos; era quase como participar de um desenho animado. O jogo foi lançado em 1991.
Uma prova de que esses jogos eram realmente bons é que os três foram portados para várias outras plataformas. Nenhum deles foi tão copiado como o Elite, mas todos tiveram muito sucesso.
A programação de jogos costumava ser feita por uma ou duas pessoas. Hoje em dia, os estúdios têm dezenas de pessoas e os lançamentos custam milhões. Com tanta responsabilidade, talvez as empresas não queiram correr riscos e por isso relançam os mesmos jogos ano após ano (quantos jogos de futebol ainda precisamos?). Por sorte, temos os emuladores para reviver os bons tempos!
Então, proponho separar os jogos por categoria, a fim de realmente aferir a habilidade técnica e a criatividade dos programadores. Eu imaginei algumas e já aproveito para premiar os melhores jogos em cada uma.
A primeira é a Mosca. Nessa categoria, o cidadão tem que ter menos memória que a necessária para armazenar uma tela do jogo, não importa a resolução. E o ganhador é Thrust para o Atari 2600. O Atari tem 128 bytes de memória e os programas normalmente têm 4KB ou menos, mas podem ser maiores se o ROM for paginado (porque o Atari só usava 12 linhas de endereçamento). Esse jogo foi originalmente escrito para o BBC Micro e rodava sobre 32KB. Ele simula a física muito bem e isso já seria impressionante se, adicionalmente, um alemão chamado Thomas Jentzsch não o tivesse portado para o Atari. O jogo, ademais, foi portado apenas em 2000, muito depois do fim do sucesso comercial da plataforma.
A segunda categoria é a Galo. Nessa categoria incluo todos os jogos escrito para micros de 8 bits. Eu escolhi um grande campeão: Elite. Esse jogo necessitava de apenas 32KB e foi uma revolução porque, além dos gráficos em 3D incríveis (com eliminação de faces ocultas), foi dos primeiros a ter conteúdo proceduralmente gerado. O universo de Elite consiste de 8 galáxias com 256 planetas cada uma. O jogo foi planejado com um número muito maior de planetas, mas a editora achou que as pessoas não iam acreditar que um micro de 8 bits pudesse gerar tanta complexidade. Ele foi lançado em 1984 (depois de dois anos de desenvolvimento) e portado para quase todos os micros da época.
A categoria Pena abarca os jogos escritos para micros de 16 bits. E o campeão é o Another World do Amiga. Ele já representa um grande salto em relação aos jogos de 8 bits, porque o Amiga tinha hardware gráfico avançado e muito mais memória (512KB, pelo menos). A grande inovação foi o uso de efeitos cinematográficos; era quase como participar de um desenho animado. O jogo foi lançado em 1991.
Uma prova de que esses jogos eram realmente bons é que os três foram portados para várias outras plataformas. Nenhum deles foi tão copiado como o Elite, mas todos tiveram muito sucesso.
A programação de jogos costumava ser feita por uma ou duas pessoas. Hoje em dia, os estúdios têm dezenas de pessoas e os lançamentos custam milhões. Com tanta responsabilidade, talvez as empresas não queiram correr riscos e por isso relançam os mesmos jogos ano após ano (quantos jogos de futebol ainda precisamos?). Por sorte, temos os emuladores para reviver os bons tempos!
sábado, 16 de outubro de 2010
Benoit Mandelbrot (1924-2010)
Benoit Mandelbrot faleceu no dia 14, aos 85 anos. O trabalho dele ajudou a gastar um incontável número de ciclos por todo o mundo. Não existe uma plataforma para a qual alguém não tenha escrito um gerador de fractais e isso deve ter tido alguma influência no clima global.
Meu primeiro gerador de fractais foi copiado de uma revista, era escrito em BASIC e demorava cerca de três horas para completar uma tela de 160 x 256. Mais tarde, com Assembly, o tempo diminuiu para minutos. Como o micro suportava apenas 8 cores, para simular mais era preciso entrelaçar pontos de cores diferentes (mas isso só funciona bem em regiões homogêneas). Mais tarde, escrevi o gerador em Pascal.
A figura acima mostra a versão Assembly (para o 6502, que sequer tem instrução de multiplicação) que foi copiada da revista Acorn User. Cada imagem ocupava 20KB, mas com um pouco de compressão (usando Run-length encoding) dava para deixá-las com 8KB ou menos. O único porém é que era mais fácil carregar uma imagem descompactada: bastava carregar do disco direto para a memória mapeada para o vídeo.
Mandelbrot escreveu que "nuvens não são esferas, montanhas não são cones, costas não são círculos, árvores não são lisas e raios não andam em linha reta". Acho que ele provou também que os computadores e a matemática podem gerar muita beleza.
Meu primeiro gerador de fractais foi copiado de uma revista, era escrito em BASIC e demorava cerca de três horas para completar uma tela de 160 x 256. Mais tarde, com Assembly, o tempo diminuiu para minutos. Como o micro suportava apenas 8 cores, para simular mais era preciso entrelaçar pontos de cores diferentes (mas isso só funciona bem em regiões homogêneas). Mais tarde, escrevi o gerador em Pascal.
A figura acima mostra a versão Assembly (para o 6502, que sequer tem instrução de multiplicação) que foi copiada da revista Acorn User. Cada imagem ocupava 20KB, mas com um pouco de compressão (usando Run-length encoding) dava para deixá-las com 8KB ou menos. O único porém é que era mais fácil carregar uma imagem descompactada: bastava carregar do disco direto para a memória mapeada para o vídeo.
Mandelbrot escreveu que "nuvens não são esferas, montanhas não são cones, costas não são círculos, árvores não são lisas e raios não andam em linha reta". Acho que ele provou também que os computadores e a matemática podem gerar muita beleza.
quinta-feira, 7 de outubro de 2010
Combinações de dígitos
Encontrar todas as combinações dentro de um conjunto é tão fácil como contar em binário. Digamos que eu tenha um conjunto de quatro itens; se eu contar até 15 (4 bits), vou ter 0000, 0001, 0010, 0011, etc.
Eu decidi que um bit 1 indica que o item está no subconjunto e que 0 indica que não está. Então, se o meu conjunto for (A, B, C, D), 0000 vai representar o conjunto vazio, 0001 vai representar (D), 0010 vai representar (C) e assim por diante. O último subconjunto é o próprio conjunto, representado por 1111.
O fato de que eu preciso contar até 2n-1 me lembrou do triângulo de Pascal. A soma dos números de cada linha do triângulo é 2n e isso me fez perceber que os números, individualmente, devem representar alguma coisa também.
Como cada número do triângulo representa a quantidade de subconjuntos com uma certa quantidade de itens, eles têm que representar também a quantidade de números que têm um determinado número de dígitos 1.
Por exemplo, a quarta linha é "1 3 3 1" e equivale a um número de 3 bits. Com 3 bits, podemos representar os seguintes números:
Temos, então, 1 número só de zeros, 3 com apenas 1 dígito 1, 3 com 2 dígitos 1 e apenas 1 com 3 dígitos 1.
Alternativamente, se eu quiser saber quantos números de 1 byte possuem 3 dígitos 1, posso rapidamente descobrir no triângulo que são 56.
Certamente, esconde-se aí alguma verdade capaz de trazer fama, dinheiro e mulheres.
Eu decidi que um bit 1 indica que o item está no subconjunto e que 0 indica que não está. Então, se o meu conjunto for (A, B, C, D), 0000 vai representar o conjunto vazio, 0001 vai representar (D), 0010 vai representar (C) e assim por diante. O último subconjunto é o próprio conjunto, representado por 1111.
O fato de que eu preciso contar até 2n-1 me lembrou do triângulo de Pascal. A soma dos números de cada linha do triângulo é 2n e isso me fez perceber que os números, individualmente, devem representar alguma coisa também.
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
1 8 28 56 70 56 28 8 1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
1 8 28 56 70 56 28 8 1
Como cada número do triângulo representa a quantidade de subconjuntos com uma certa quantidade de itens, eles têm que representar também a quantidade de números que têm um determinado número de dígitos 1.
Por exemplo, a quarta linha é "1 3 3 1" e equivale a um número de 3 bits. Com 3 bits, podemos representar os seguintes números:
000 = 0
001 = 1
010 = 2
011 = 3
100 = 4
101 = 5
110 = 6
111 = 7
001 = 1
010 = 2
011 = 3
100 = 4
101 = 5
110 = 6
111 = 7
Temos, então, 1 número só de zeros, 3 com apenas 1 dígito 1, 3 com 2 dígitos 1 e apenas 1 com 3 dígitos 1.
Alternativamente, se eu quiser saber quantos números de 1 byte possuem 3 dígitos 1, posso rapidamente descobrir no triângulo que são 56.
Certamente, esconde-se aí alguma verdade capaz de trazer fama, dinheiro e mulheres.
terça-feira, 5 de outubro de 2010
Como enriquecer com informática
Eu já escutei mais de uma vez que não se pode ganhar dinheiro com informática. Obviamente, os desiludidos referiam-se a muito dinheiro.
Eu tenho certeza de que estão errados, porque dentre os mais ricos do mundo estão vários programadores. Bill Gates escreveu um BASIC e Larry Ellison escreveu um banco de dados, por exemplo.
Talvez essas pessoas simplesmente não saibam ganhar muito dinheiro e, portanto, mudar de profissão não vai ajudar em nada. Ou talvez não tenham realmente tentado. Parece-me que, para ser realmente rico, é preciso fazer algo diferente do que todo mundo está fazendo.
Atualmente, estou colocando muita fé na loteria. Sim, eu sei que todo mundo está fazendo isso. Então, para fazer algo diferente, resolvi aplicar minhas habilidades: escrevi um programa para procurar as combinações mais freqüentes nos números ganhadores. Eu procurei os números, as duplas, os trios, etc.
Para achar as combinações escrevi uma pequena função que recebe uma referência a uma lista e uma referência a uma função. Ela conta de 1 a 2n-1 e monta uma sub-lista conforme os bits que estiverem ativados no número corrente.
Então, se eu tiver uma lista de 6 números, a função vai contar de 1 a 63. Em binário, é de 1 (o primeiro item selecionado) a 111111 (todos os itens selecionados). A cada iteração, ela invoca a função passada como parâmetro para que essa contabilize a ocorrência.
Quem quiser o código fonte completo e os números ganhadores deve me enviar R$100.
Eu tenho certeza de que estão errados, porque dentre os mais ricos do mundo estão vários programadores. Bill Gates escreveu um BASIC e Larry Ellison escreveu um banco de dados, por exemplo.
Talvez essas pessoas simplesmente não saibam ganhar muito dinheiro e, portanto, mudar de profissão não vai ajudar em nada. Ou talvez não tenham realmente tentado. Parece-me que, para ser realmente rico, é preciso fazer algo diferente do que todo mundo está fazendo.
Atualmente, estou colocando muita fé na loteria. Sim, eu sei que todo mundo está fazendo isso. Então, para fazer algo diferente, resolvi aplicar minhas habilidades: escrevi um programa para procurar as combinações mais freqüentes nos números ganhadores. Eu procurei os números, as duplas, os trios, etc.
Para achar as combinações escrevi uma pequena função que recebe uma referência a uma lista e uma referência a uma função. Ela conta de 1 a 2n-1 e monta uma sub-lista conforme os bits que estiverem ativados no número corrente.
Então, se eu tiver uma lista de 6 números, a função vai contar de 1 a 63. Em binário, é de 1 (o primeiro item selecionado) a 111111 (todos os itens selecionados). A cada iteração, ela invoca a função passada como parâmetro para que essa contabilize a ocorrência.
sub combinations {
my ($array, $callback)=@_;
my $n=scalar(@$array);
for my $i (1..(2**$n)-1) {
my @t=();
for my $index (0..$n-1) {
push(@t, $$array[$index]) if $i & 2**$index;
}
&$callback(@t);
}
}
Quem quiser o código fonte completo e os números ganhadores deve me enviar R$100.
Assinar:
Postagens (Atom)